在后台每 X 分钟执行一次函数不起作用

2024-05-14

我使用此代码每 X 分钟执行一次函数:

- (void)executeEveryOneMinute
{
    [self myFunction];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        [self executeEveryOneMinute];

    });
}

当应用程序位于前台时它会起作用。
但是当应用程序进入后台时,它就不再工作了。
当我再次将应用程序返回前台时,它会执行一次函数。
并继续每分钟再次调用函数。

那么如何让它在后台工作呢?


See the 后台执行和多任务处理的部分iOS 应用程序编程指南:应用程序状态和多任务处理 https://developer.apple.com/library/prerelease/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1讨论可能性。例如,您可以让应用程序在后台运行几分钟,以完成一些有限长度的任务。或者,如果应用程序正在执行非常特定的功能列表之一(引用上述文档),您可以继续在后台运行该应用程序更长的时间:

  • 在后台向用户播放音频内容的应用程序,例如音乐播放器应用程序
  • 在后台录制音频内容的应用程序。
  • 让用户随时了解其位置的应用程序,例如导航应用程序
  • 支持互联网语音协议 (VoIP) 的应用
  • 需要定期下载和处理新内容的应用
  • 从外部配件接收定期更新的应用程序

实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架来实现这些服务的相关方面。声明服务可以让系统知道您使用哪些服务,但在某些情况下,实际上是系统框架阻止您的应用程序被挂起。

但是,iOS 电池/电源管理的一个基本设计原则是随机应用程序不能(也不应该)继续在后台运行。如果您分享您正在尝试执行的操作(即您在其中执行的操作)executeEveryOneMinute方法),不过,如果可能的话,我们可以提供如何达到预期效果的建议。


如果您尝试在后台继续上传,在 iOS 7 及更高版本中,您应该考虑使用NSURLSession具有后台会话配置([NSURLSessionConfiguration backgroundSessionConfiguration:identifier]; iOS 8 中有类似的方法)。这不仅会在您的应用程序离开前台后,而且甚至在应用程序终止后(例如由于内存压力或崩溃)继续尝试上传(自动,无需您进一步干预)。 AFNetworking 提供了NSURLSession基于类,AFURLSessionManager http://cocoadocs.org/docsets/AFNetworking/2.0.0/Classes/AFHTTPSessionManager.html,它支持这一点(尽管它不是NSOperation-基于)。这样,您就可以享受后台上传的乐趣,同时又符合 Apple 关于后台操作的指南,尤其是与每 60 秒重试一次相比,对电池的影响较小。

我建议你参考WWDC 2013视频的后半部分基础网络的新功能 https://developer.apple.com/videos/wwdc/2013/?id=705,它演示了这个过程(他们正在执行下载,但上传的想法是相同的)。

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

在后台每 X 分钟执行一次函数不起作用 的相关文章

随机推荐