当应用程序处于后台时,中断后恢复执行代码

2023-12-28

我花了几天时间在 SO 和其他网站上研究这个问题的答案,但没有任何运气。

本质上,我为自己设定的挑战是为 iOS 创建一个闹钟应用程序,无论用户在哪里(前台或后台),它都会发出声音。我已经通过使用 AVAudioPlayer 实例并在用户设置闹钟时开始播放空声音文件来完成此操作,以便应用程序继续在后台运行。当闹钟响起时(即当 NSTimer 被触发时),已经启动并准备播放的第二个播放器开始播放用户醒来的铃声。

此外,我还通过实现 AVAudioSessionDelegate 方法 beginInterruption 和 endInterruptionWithFlags 设法处理电话、系统计时器或闹钟造成的中断。它在后台和前台模式下都可以工作,但最奇怪的事情发生了:

当中断结束时,AVAudioPlayer 恢复播放,但我无法执行应用程序中的任何其他代码,除非我再次将应用程序带到前台。

为了弄清楚这一点,我尝试了一个更简单的项目,我将其发布在下面。 这个应用程序的作用是,只要您进入该应用程序,AVAudioPlayer 类的实例就会开始循环播放特定的声音。然后,当您将其置于后台时,播放器将继续循环播放声音。当发生中断时,我暂停播放器,当它结束时,我使用调度等待几秒钟,然后调用两个方法,即 (void)playPlayer,一个包含恢复播放文件的代码的方法和 (void)tester ,一个包含计时器的方法,该计时器设置为在中断结束后 5 秒(确切地说是 7 秒)停止播放器。这两种方法都会被调用,如我放入其中的 NSLogs 所示,但计时器永远不会被触发,并且玩家会继续无限期地玩。

这是 .h 文件的代码:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

@interface InterruptionTest3ViewController : UIViewController <AVAudioSessionDelegate,      AVAudioPlayerDelegate>
{
    AVAudioSession *mySession;
    AVAudioPlayer *myPlayer;
}

-(void) playPlayer;
-(void) pausePlayer;
-(void) tester;

@end

这是 .m 文件的代码:

#import "InterruptionTest3ViewController.h"

@interface InterruptionTest3ViewController ()

@end

@implementation InterruptionTest3ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    mySession = [AVAudioSession sharedInstance];
    NSError *setActiveError = nil;
    [mySession setActive:YES withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:&setActiveError];
    if (setActiveError) {
        NSLog(@"Session failed to activate within viewDidLoad");
    }
    else {
        NSLog(@"Session was activated within viewDidLoad");
    }
    NSError *setCategoryError = nil;
    [mySession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
    if (setCategoryError) {
        NSLog(@"Category failed to be set");
    }
    else {
        NSLog(@"Category has been set");
    }

    [mySession setDelegate:self];


    NSString *path = [[NSBundle mainBundle] pathForResource:@"headspin" ofType:@"wav"];
    NSError *initMyPlayerError = nil;
    myPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]     error:&initMyPlayerError];
    if (initMyPlayerError) {
        NSLog(@"myPlayer failed to initiate");
    }
    else {
        NSLog(@"myPlayer has been initiated");
    }

    [myPlayer prepareToPlay];
    [self playPlayer];

    OSStatus propertySetError = 0;
    UInt32 allowMixing = true;

    propertySetError = AudioSessionSetProperty (
                                                kAudioSessionProperty_OverrideCategoryMixWithOthers, 
                                                sizeof (allowMixing),                                 
                                                &allowMixing                                          
                                                );

    [myPlayer setNumberOfLoops:-1];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}

-(void) beginInterruption
{
    [myPlayer pause];
}

-(void) endInterruptionWithFlags:(NSUInteger)flags
{
    if (flags) {
        if (AVAudioSessionInterruptionFlags_ShouldResume) 
        {
            {
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC),dispatch_get_main_queue(), ^{

                    [self playPlayer];
                    [self tester];
                });
}
        }
    }
}

-(void) tester
{
    [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(pausePlayer) userInfo:nil repeats:NO];
    NSLog(@"tester method has been called");
}

-(void) playPlayer
{
    [NSTimer timerWithTimeInterval:5.0 target:myPlayer selector:@selector(stop) userInfo:nil repeats:NO];
    [myPlayer play];
    NSLog(@"playPlayer method has been called");
}

-(void) pausePlayer
{
    [myPlayer pause];
}



//viewDidUnload etc not listed.

所以,这就是伙计们。同样,为什么当应用程序在后台时,计时器在中断后没有被触发?我需要在 applicationDidEnterBackground 方法中设置一些内容吗?

预先非常感谢您!


请使用“[NSTimerchedTimerWithTimeInterval:5.0目标:myPlayer选择器:@selector(stop)userInfo:nil重复:NO]”;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当应用程序处于后台时,中断后恢复执行代码 的相关文章

  • 如何在 Objective C 中使用 swift 文件

    我想在 Objective C 代码中使用我的 Swift 文件 我找到了不同的链接 说明了如何操作 我的项目名称是 测试项目 我将 import Test Project Swift h 导入到我的 m 文件中 以在 Objective
  • iOS 无状态/无值进度条?

    我希望在 iOS 中获得无状态 无值的 UIProgressView 或其他类型的进度条 我尝试查找一些文档 但找不到与我的问题相关的任何内容 如果你们有任何建议 我很想听听 Thanks Shai iOS s UI进度视图 https d
  • 如何在 Swift Playground 中使用 Carthage 导入的框架

    我有一个快速项目 其中通过迦太基添加了一些框架 是否可以在项目内部的游乐场中使用这些框架以及如何使用它 因为 import Argo 不起作用 这在某个时候停止工作了 叹 我现在做的是 创建 macOS gt 命令行工具 创建一个购物车文件
  • 使用可达性有什么好处?

    与下面的代码相比 使用 Reachability 有什么优势 我觉得 Reachability 有大量代码 但如果它在任何方面更好 那么我会使用它 NSString connectionString NSString alloc initW
  • WKWebView不加载https URL?

    我有一个 WKWebView 应该加载以下网址 https buchung salonmeister de place offer details page id 907599 venueId 301655 她是我使用的代码 import
  • 如何将 Xcode 指向旧的 SDK,以便将其用作“基础 SDK”?

    我的 Mac 的设置 Volume A 操作系统 X 10 8Xcode 4 5 或更高版本 10 6 SDKIS NOT作为基础 SDK 提供 Volume B 操作系统 X 10 7Xcode 4 3 3 10 6 SDKIS作为基础
  • 应用内购买:卡在 paymentWithProductIdentifiers - 已弃用

    我一直在设置应用内购买 我无法做到这一点 SKPayment paymentRequest SKPayment paymentWithProduct co za nideo 100shotsbuybeer 我从 SKPayment paym
  • 如何在 IOS 中以编程方式滚动 UICollectionViewCell?

    我有一个垂直的UICollectionView每个细胞占据整个self view frame我可以轻松地向上滑动以翻页到下一个单元格 但我想通过按按钮来执行相同的操作 我尝试过使用 void setContentOffset CGPoint
  • Firebase queryOrderedbyChild 不返回 Null 值

    我有一个根据年龄搜索用户的查询 self ref child users queryOrdered byChild age queryStarting atValue 18 queryEnding atValue 25 observeSin
  • 如何将动画应用到 GMSMarker

    我正在通过使用适用于 iOS V1 1 0 的 Google Maps SDK 将 iOS 地图迁移到 google 地图来更改我的应用程序 并且我尝试在添加 删除时对标记进行动画处理 但我在与此相关的文档中没有找到任何建议 请建议我如何在
  • ARC 禁止合成未指定所有权或存储的财产

    我创建了一个 property of UIColor property nonatomic UIColor color 然后我尝试合成它 synthesize color color 但我收到一个错误 ARC 禁止合成具有未指定所有权或存储
  • 如何去除 UIImageView 遮罩后的透明区域?

    在我的一个 iOS 应用程序中 我尝试使用以下命令剪切图像的一部分CGImageMask 我已成功使用以下代码屏蔽图像 UIImage maskImage UIImage referenceImage withMask UIImage ma
  • 如何将 OSX 上的 Xcode 更新到最新版本?

    在 OSX 上更新 Xcode 最简单的方法是什么 我在终端中看到这个 brew install xxxxxxx Warning Your Xcode 4 3 3 is outdated Please install Xcode 4 6 但
  • 如何更改 MGLPolyline 的颜色?

    如何更改 MGLPolyline 的颜色 我曾经看过here https stackoverflow com questions 32024464 customize mglpolyline using mapbox但答案不起作用 我还尝试
  • 在 CI (Travis/Jenkins) 环境中使用 xcodebuild (Xcode 8) 和自动签名

    随着 Xcode 8 的发布 Apple 引入了一种管理签名配置的新方法 现在你有两个选择Manual and Automatic 根据 WWDC 2016 关于代码签名的会议 WWDC 2016 401 Xcode 应用签名的新增功能 h
  • 添加到 Xcode App 时,Bazel 框架抛出“无法检查应用程序包”

    我正在使用 Bazel 构建基于 MediaPipe 的人脸识别库 我正在使用apple xc框架 https github com bazelbuild rules apple blob master doc rules apple md
  • NSData 不接受有效的 base64 编码字符串

    我正在 iOS 7 客户端实现 JSON Web Token 身份验证 效果很好 我的应用程序接收令牌 并可以使用它们对我的服务器进行经过身份验证的调用 现在 我希望我的客户端代码检查令牌的过期日期 以便它知道何时重新进行身份验证 检查 J
  • 错误 ITMS-90207 Apple Store 提交

    当我在模拟器或设备上运行我的应用程序时 用于调试和发布构建配置 它可以完美运行 但是当我尝试将我的应用程序提交到 Apple Store 时 出现以下错误 错误 ITMS 90207 捆绑包无效 APPNAME app 处的捆绑包确实 不包
  • UILocalNotification 播放自定义声音

    我在我的应用程序中实现了本地通知 但我只是想知道是否有一种方法可以播放不属于 iPhone 应用程序主包的一部分的声音 基本上在我的应用程序中 我希望用户录制生成本地通知时播放的声音 而不是播放预先录制的或默认的声音 据我所知 这是可以实现
  • Xcode - 调试视图层次结构

    我正在尝试调试应用程序的视图层次结构 Xcode 窗口的左侧窗格中出现了一个紫色的小方块 请参见屏幕截图 知道这个问题可能是什么吗 好吧 我找到了这个问题的根源 这是一个约束问题

随机推荐

  • WooCommerce 在成功结账时对每个产品执行 PHP

    仅当在 WooCommerce 中成功结帐时 我才需要为购买的每个产品 基于 ID 执行一些 PHP 有谁知道这是否可能 如果可以的话 你能给我指出正确的方向吗 Thanks 你可以运行一个函数woocommerce payment com
  • WinDbg !heap 命令由于缺少符号而无法工作

    我正在尝试使用 WinDbg 调试带有 C 非托管内存分配的 NET 应用程序 当我尝试运行 heap命令 我收到以下错误消息 0 022 gt heap ERROR Symbol file could not be found Defau
  • Graphviz:更改子图簇内的节点间距

    经验丰富但不是 Graphviz 专家 我分享的示例代码和图像是更大图表的一部分 我将其拉出来以使问题和示例更清晰 该图是按等级分开的并且从左到右流动 在图像示例中 您可以看到三个等级和节点空间很好 但我想在子图中收紧它们 我已经尝试了六种
  • 如何实现对2个不同表数据的搜索?

    使用 mysql 和 PHP 我已经在使用 MATCH AGAINST 子句了 它在单独的表上运行良好 就像我想在商店表中搜索一样 没问题 我想要的是能够在单个结果页面中搜索和显示不同表的结果 例如 如果我输入 巧克力衣服 我可能会得到4个
  • 在 C++ 或 Qt 中格式化 XML 文件

    我有一个 XML 文件 其中输出未格式化 这意味着所有输出都在一行中 但我想逐个标签地打破它 例如
  • all.moments 功能奇怪的结果

    我想计算分布的 n 阶矩 我正在尝试使用 R 中库 moments 的 all moments 函数 我已经以这种方式测试了 all moments library moments r lt rnorm 10000 rr lt all mo
  • 移动网络应用程序可以在后台运行吗? (iOS 和安卓)

    移动网络应用程序可以在后台运行吗 我主要对 iOS 和 Android 感兴趣 Thanks 由于这种情况几乎每天都在变化 因此我将发布更新的答案 这适用于这些浏览器的最新版本 但明天可能会发生变化 My 音乐应用程序 http thedi
  • .NET 中是否有多核排序实现?

    NET 中是否有多核排序实现 这是我不久前使用的多线程快速排序async await 在一定的排序大小下 它 恢复 回称为双端选择排序的基本排序 public static class SortExtensions
  • 一起使用@Spy和@Autowired

    我有一个带有 3 个方法的服务类 服务类还使用一些 Autowired 注释 在 3 种方法中 我想模拟两种方法 但对第三种方法使用真实方法 问题是 如果我将 Autowired 与 Spy 一起使用 则将调用所有三个实际方法实现 如果我仅
  • IIS应用程序池PID

    有谁熟悉获取与进程 ID 关联的应用程序池的方法吗 我正在使用 Win32 Process 查询 W3WP 服务并返回 PID 现在我正在尝试获取与其关联的应用程序池 在 Windows Server 2008 上 情况发生了变化 in s
  • 设置按钮助记键事件,无需使用 ALT

    Is there a way to set a button key event in Java so that Alt does not have to be pressed For example when this is used s
  • 如何在不使用 Visual Studio 的情况下编辑 RDLC 报告

    我现在正在研究Sql Server Management Studio和 Visual Studio C 我创建了一个Stored Procedure从数据库中的表中检索数据 使用结果dataset 我创建了一个rdlc使用 Visual
  • python中的复杂if语句

    我需要实现一个complexPython 中的 if elif else 语句 但我无法让它工作 我需要的 elif 行必须检查变量是否满足此条件 80 443 或 1024 65535 含 I tried if several check
  • 可观察以及如何控制结果速度

    我正在寻找一个运算符来帮助我调整可观察值发出的结果 它看起来像这样 A BC D E A B C D E 我尝试了 AuditTime 但它不会重播间隔之间发出的结果 它会执行以下操作 A BC D E A C E 感谢您的帮助 我认为这应
  • 带有输入元素的 AngularJS 自定义指令,从外部传递验证器

    我正在使用一个简单的自定义指令来修改整个应用程序中出现的输入字段 app directive editor function return restrict E templateUrl editor html scope value The
  • Doctrine 2.2 + Zend Framework 分页速度优化

    我在使用时遇到了 Doctrine 2 性能问题HYDRATE OBJECT 当我从HYDRATE ARRAY to HYDRATE OBJECT 需要花费近10倍的时间 我用过学说 2 和 zend paginator https sta
  • 无法使用 Visual Studio 2019 在 C++ 程序中打开 txt 文件

    在使用 XCode 一段时间后 我刚刚开始使用 Visual Studio 2019 我总是能够在 XCode 中打开 txt 文件 但现在 我无法在 Visual Studio 2019 中打开它们 基本上我所做的是在 调试 选项卡中按
  • 确定字节码中 super() 方法调用的位置,所有构造函数都必须在 JVM 上执行此操作

    我想知道在分析构造函数的字节码时是否有一种明显且快速的方法来确定super 代码结尾为 更具体地说 与 Java 形成鲜明对比 在 Java 中 在构造函数中调用任何super 构造函数方法是可选的 或者更确切地说 当不存在时 隐式 在字节
  • 如何从我的域逻辑生成 NHibernate 映射文件和数据库结构?

    我想在项目中的域对象上实现 NHibernate 但我不确定应该如何生成映射文件和数据库 我发现了一些与此相关的问题here https stackoverflow com questions 432118 generate databas
  • 当应用程序处于后台时,中断后恢复执行代码

    我花了几天时间在 SO 和其他网站上研究这个问题的答案 但没有任何运气 本质上 我为自己设定的挑战是为 iOS 创建一个闹钟应用程序 无论用户在哪里 前台或后台 它都会发出声音 我已经通过使用 AVAudioPlayer 实例并在用户设置闹