应用程序未运行时的 iOS 7 后台获取

Posted

技术标签:

【中文标题】应用程序未运行时的 iOS 7 后台获取【英文标题】:iOS 7 Background Fetch When the App is Not Running 【发布时间】:2014-03-24 11:17:09 【问题描述】:

我编写了一个简单的应用程序来测试和监控 background fetch 功能在 ios7 中的工作方式。

首先,我在 Info.plist 文件中设置了 UIBackgroundMode 选项。

那么;

我将以下代码添加到 AppDelegate.m 中的 application:didFinishLaunchingWithOptions: 方法中:

最后,我实现了 application:(UIApplication *)application performFetchWithCompletionHandler: 请求的方法。

每次我点击Debug->Simulate Background Fetch按钮时,它都会改变应用程序的批号并按预期工作。

但是,当应用程序未运行(即使在后台模式下,只是未运行)时,我始终无法使其工作。

Apple 表示,当应用程序未运行且 OS 想要分别执行以下方法时:

application:(UIApplication *)application didFinishLaunchingWithOptions:
applicationDidEnterBackground:(UIApplication *)application
application:(UIApplication *)application performFetchWithCompletionHandler:

所以我的问题是,有没有办法在应用未运行时测试后台获取?

我正在我的 装有 iOS 7.1 的 iPod 5th Gen 上对此进行测试。

【问题讨论】:

我不这么认为,因为您永远无法知道操作系统何时会执行此操作。如果它在你测试过的条件下工作,那么当你发布它时,一切应该工作......如果不使用静默推送通知,就无法在实时环境中触发它。 尝试在其中一种情况下安排本地通知,看看它是否会触发。 我尝试在调用时显示本地通知,但我找不到在应用程序未运行时触发后台获取的方法。我只是想确定它是否真的在做它提供的东西。 你要等多久?例如,我的应用每 1-2 小时唤醒一次以获取数据,当我离开设备过夜时,我会在日志中看到我的调试消息。 如果应用程序崩溃系统重新启动它(肯定 100%),但如果用户杀死应用程序我认为它更新更多运行(但不确定:) 【参考方案1】:

编辑 2: 请注意,如果用户从应用切换器中终止应用,后台提取将不再发生。这正在按照 Apple 的预期工作。有关详细信息,请参阅相关的 "Understanding When Your App Gets Launched into the Background" 文档:

在大多数情况下,系统在应用程序被强制后不会重新启动它们 由用户退出。一个例外是位置应用程序,它在 iOS 8 和 稍后被用户强制退出后重新启动。

还有一个旧的开发者论坛帖子(不幸的是,该链接已不存在)...

“如果你从多任务 UI 中杀死一个应用程序,系统将永远不会 再次自动启动应用程序。这里的逻辑是,如果 用户已经杀死了你的应用,他们可能希望它保持死态。”

您可以向您的网络服务器发出一个简单的 GET 请求,例如:“http://dev.example.org/?ping=1”,然后在网络服务器上 grep access.log 以获取“?ping=1”

编辑:另一种测试在后台启动的应用程序的方法(例如:不能双击主页按钮并切换到它)是创建一个仅后台方案。转到产品 -> 方案 -> 管理方案,然后复制您的默认方案。

然后编辑新方案并单击选项选项卡并选中“由于后台获取事件而启动” - 当您运行您的应用程序时,它将直接启动到后台,就像通过正常使用一样。

【讨论】:

如果应用被明确杀死,关于 iOS 的部分是否不会重新启动仍然正确?它似乎适用于我的应用程序,它使用后台获取。但是我刚刚启动然后关闭了 Gmail 应用程序并向自己发送了一封电子邮件,而 Gmail 应用程序仍然发布通知.... wtf? Gmail 应用程序使用另一种机制(推送通知)与 BackgroundFetch 一起完成。 @MikeAsdf 谢谢,添加了一个文档链接并删除了损坏的论坛链接。 @taber 如何在应用程序关闭/暂停时每隔一分钟通过 api 将当前位置更新到我的服务器? 你有什么线索吗?

以上是关于应用程序未运行时的 iOS 7 后台获取的主要内容,如果未能解决你的问题,请参考以下文章

应用程序未运行时的 Windows Phone 7 推送通知

应用程序未运行时的 iOS 10 远程通知

在后台处理应用程序时的 iOS 推送通知

当应用程序在 iOS 中关闭且应用程序未在后台运行时从推送通知中获取数据

关闭应用程序时的 iOS 7.1 CoreLocation 和地理围栏

推送以唤醒后台 iOS 8 应用程序未获取任何数据