重复调用beginBackgroundTaskWithExpirationHandler

时间:2016-04-29 17:29:39

标签: objective-c background-process uiapplication

我正在评估一些堆栈调用beginBackgroundTaskWithExpirationHandler的代码,以便在后台留下一个计时器。不得不承认这是一个非常聪明的想法,但不确定这是否是最佳做法。

所以流程:

  1. 使用回调处理程序
  2. 调用beginBackgroundTaskWithExpirationHandler
  3. 当它返回时,做一些事情,然后再打电话
  4. 冲洗并重复,沿路检查TaskInvalid
  5. 我知道180秒是最长时间,但在某些情况下这可能会更短。

    问题:

    1:这合法吗?

    2:你会怀疑苹果公司能不能给应用程序一遍又一遍地提供3分钟的背景,从而让这个过程在后台停留一小时?

    3:你会指望这个吗?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

  

你会怀疑苹果公司能不能给应用程序一遍又一遍地提供3分钟的背景,从而让这个过程在后台停留一小时?

不,即使你能做到,苹果也不会对它好。由于某种原因,他们指定了3分钟的限制,以确保我们在用户不知情的情况下没有在后台运行应用程序,消耗CPU周期,内存和耗尽电池。 (实际上,“有限任务”限制曾经是5分钟,但几年前Apple进一步将其限制在3分钟。)想象一下,所有应用程序开发人员经常规避这3分钟限制的世界,我们的设备会有他们的电池耗尽很快,前台应用程序响应速度较慢,操作内存也较少。

话虽如此,Apple已经确定了一组非常狭窄的操作,可以在后台运行(VOIP,导航应用程序,音乐应用程序,蓝牙操作等),用户对电池有合理的期望和绩效影响。

还有一些任务类别使用一些有限的后台功能(例如,请求时间完成一些有限长度的任务,机会性定期后台获取,重要的变更位置服务,让用户有机会响应推送或本地通知等)。目的是在背景能力之间提供有意义的平衡,同时最大限度地减少电池影响。

最重要的是,Apple不鼓励/减少使用不分青红皂白的后台操作。在App Store Guidelines中,他们明确说出

  

2.16多任务应用程序只能将后台服务用于其预期目的:VoIP,音频播放,位置,任务完成,本地通知等。

     

...

     

4.5使用后台位置服务的应用程序必须使用人机界面指南中描述的机制提供澄清使用目的的原因

说完所有这些后,如果你描述了你需要这个后台操作的具体内容,我们或许可以描述Apple提供的众多不同背景功能中的哪一个可以用来实现所需的效果。所有这些接口都旨在解决特定问题,同时平衡功能与我们设备上的稀缺资源。但是,如果它像“嘿,我想每隔五分钟ping一次我的服务器”,那么不,Apple会对此不以为然。

有关详细信息,请参阅 iOS应用程序编程指南的Background Execution章节中详细讨论。