ios - 即使应用程序关闭,我也可以运行后台线程吗

Posted

技术标签:

【中文标题】ios - 即使应用程序关闭,我也可以运行后台线程吗【英文标题】:ios - Can I run background thread even app is turned off 【发布时间】:2014-12-30 04:15:26 【问题描述】:

我有一个应用程序,它会在特定时间提醒用户。现在,我想每 60 分钟(或其他持续时间:1 天、1 周、...将来)从服务器同步数据。即使应用程序已关闭,也必须运行它。

我也听到了很多不同的答案,但大多数是“ios不允许开发人员制作后台线程”。有人可以帮我确认一下吗?

如果我们不能做后台线程,是否有其他解决方案来解决这个问题?

我期待听到任何人的答案!

谢谢, 瑞恩

【问题讨论】:

【参考方案1】:

如果您只需要定期提醒用户,则确实可以安排本地通知并且相当容易实现。如果您需要实际更新内容,请查看后台获取:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

【讨论】:

感谢您的回答!似乎这里是现在最好的解决方案之一。【参考方案2】:

这不是您要找的,但请参阅App Programming Guide for iOS: Background Execution,尤其是机会性地获取少量内容部分:

机会性地获取少量内容

需要定期检查新内容的应用可以要求系统唤醒它们,以便它们可以启动对该内容的提取操作。要支持此模式,请在 Xcode 项目的 Capabilities 选项卡的 Background mode 部分启用 Background fetch 选项。 (您也可以通过在您的应用程序的Info.plist 文件中包含带有提取值的UIBackgroundModes 键来启用此支持。)启用此模式并不能保证系统会给您的应用程序任何时间执行后台提取。系统必须平衡您的应用程序获取内容的需求与其他应用程序和系统本身的需求。在评估该信息后,系统会在有好的机会时为应用留出时间。

当一个好的机会出现时,系统会唤醒或启动您的应用程序到后台并调用应用程序委托的application:performFetchWithCompletionHandler: 方法。使用该方法检查新内容并在内容可用时启动下载操作。完成下载新内容后,您必须立即执行提供的完成处理程序块,传递指示内容是否可用的结果。执行此块会告诉系统它可以将您的应用程序移回挂起状态并评估其电源使用情况。快速下载少量内容并准确反映何时有内容可供下载的应用程序,与需要很长时间才能下载其内容或声称内容可用但随后执行的应用程序相比,更有可能在未来获得执行时间不下载任何东西。

下载任何内容时,建议您使用NSURLSession 类来启动和管理您的下载。有关如何使用该类管理上传和下载任务的信息,请参阅URL Loading System Programming Guide。

【讨论】:

问题是,绝对不能保证什么时候会发生。 “当一个好机会出现时”可能是一周后。 完全正确。没有“每 60 分钟执行一次网络请求”功能,只有这种机会主义的后台获取。这是 Apple 批准的在应用程序不活动时进行网络请求的机制(除非您是那些特殊用途的后台模式之一,例如 VOIP 或您有什么),或者您进行推送通知,这完全是另一回事。 谢谢罗伯!您的回答对我很有帮助,感谢您详细解释。【参考方案3】:

您可以安排本地通知来提醒用户,但就像在 android 中一样,您不能运行后台服务。

【讨论】:

【参考方案4】:

你有它倒退。该应用程序如果未运行,则无法唤醒以检查服务器。但是服务器可以将数据推送到应用程序并唤醒它——这就是推送通知(远程通知)的全部内容:

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html#//apple_ref/doc/uid/TP40008194-CH102-SW1

所以当你想同步到应用程序时推送它。

【讨论】:

感谢您的回答,马特。这是迄今为止对我最有帮助的答案之一。

以上是关于ios - 即使应用程序关闭,我也可以运行后台线程吗的主要内容,如果未能解决你的问题,请参考以下文章

即使在终止应用程序后,我们还能获取位置信息吗? [关闭]

如何在iphone的后台获取位置[关闭]

即使我的应用程序关闭,也会在后台运行 dart 代码

应用程序未运行时的iOS后台模式?

即使应用程序处于后台,也可以为 UiView 设置动画

iOS屏幕关闭时如何继续监控iBeacon?