进入后台状态时是不是可以在 iOS 4 设备上运行 NSThread 或 NSTimer?

Posted

技术标签:

【中文标题】进入后台状态时是不是可以在 iOS 4 设备上运行 NSThread 或 NSTimer?【英文标题】:Is it possible to run an NSThread or NSTimer on iOS 4 device when it enters the background state?进入后台状态时是否可以在 iOS 4 设备上运行 NSThread 或 NSTimer? 【发布时间】:2011-08-19 10:40:45 【问题描述】:

我正在编写一个音频应用程序,它使用 iPod 音乐播放器播放 iPod 音乐库中的媒体项目。

现在我知道 iPod 可以在后台继续播放,但我还想在后台运行线程或计时器,其中选择器方法定期检查音乐播放器的状态这样应用程序就可以应用规则来应用曲目之间的延迟,并在后台自动将新的媒体收藏加载到播放器中。

这可能吗?

如果没有,是否有其他方法可以实现此功能?

【问题讨论】:

【参考方案1】:

诀窍是不要使用MPMusicPlayerController,因为当您的应用程序进入后台时,它实际上会将控制权交给 iPod 应用程序(您可以通过关闭您的应用程序并打开 iPod 应用程序来检查这一点)。

对于我目前正在开发的音乐应用程序,我使用AVAudiosessionAVPlayer不是 AVAudioPlayer)推出了自己的音乐播放器。我在播放器上实现了一个队列,以及一个为队列提供数据的数据源(类似于 UITableViewDatasource)。所有这一切都在后台运行时运行良好,并且与 iPod 应用程序没有任何关联(作为额外的奖励,您的应用程序图标会出现在多任务栏上的遥控器旁边)。

如果您开发了类似的东西,那么当您向数据源询问队列中的下一个项目时,您可以查询您的规则集并决定下一步该做什么。

【讨论】:

谢谢,这听起来很有趣,但是您实际上是如何在后台运行代码的?您使用的是线程还是任务? iOS 4 似乎对允许在后台持续运行的服务相当严格。文档说明了 iPod 音乐播放器、gps 位置和 VoIP。考虑到这一点,您如何实现音乐播放器以在后台运行时即时更新其队列等? 不,docs 状态 audio 不是 iPod 音乐播放器。 哦,你是说因为它是一个音频服务,操作系统让它保持运行。 是的。 AVAudioSession 通知操作系统您正在使用音频的上下文,AVPlayer 负责播放音频。 谢谢,我会看看这个。【参考方案2】:

当然。您可以在应用程序委托的applicationDidEnterBackground: 中执行此操作。

来自模板:

如果你的应用支持后台执行,这个方法是 在用户退出时调用而不是 applicationWillTerminate:。

【讨论】:

我知道 applicationDidEnterBackground: 但即使我要在此方法中设置计时器或线程,当应用程序进入后台状态时,它们不会与进程主运行循环一起关闭? 这是不可预测的。当手机因为其他应用程序耗尽内存时,它会关闭所有后台应用程序,包括邮件等。但只要有足够的内存,它应该会继续。 有意思,我试试,谢谢建议。【参考方案3】:

是的,现在,您不能使用NSTimer,因为它们已失效。 您可以启动一段代码以通过 GCD 运行以在后台运行,这将具有最大值。执行时间为 10 分钟。

【讨论】:

好的,我希望在应用程序处于后台状态的整个过程中将规则应用于音乐播放器,这可能吗? 你可以指定你的应用需要在后台播放音频。只要有音频会话,iOS 将允许您的应用程序继续运行。没有办法超过 10 分钟。后台执行的最大值。

以上是关于进入后台状态时是不是可以在 iOS 4 设备上运行 NSThread 或 NSTimer?的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 后台任务无法在 iOS 5.0.1 设备上运行,但在 iOS 5 模拟器上运行

在 iOS 上,当应用程序进入后台时 UnityWebRequest 下载停止

iOS - 当应用程序在后台时取消蓝牙连接

当手机进入空闲状态时后台服务停止

在 iOS 13 设备中无法在后台/挂起状态下接收 VoIP 消息

《转载》IOS高级开发~开机启动&无限后台运行&监听进程