performFetchWithCompletionHandler永远不会被触发

时间:2013-08-19 14:02:48

标签: ios objective-c ios7

1)我的plist配置提供了backgroundmode:

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
</array> 

2)在didFinishLaunchingWithOptions我有:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];

3)我在委托中声明了协议UIApplicationDelegate

4)我实现了以下方法,但它永远不会被触发。 (仅当我使用“XCode-&gt; Debug-&gt; Simulate Background Fetch”模拟获取时才有效。)

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

为什么呢?这是DP5 beta错误吗?我应该关注这个吗?

9 个答案:

答案 0 :(得分:94)

在Xcode 5 Debug模式下,您可以强制从菜单中获取背景:Debug&gt;模拟后台获取。

Ruff!

答案 1 :(得分:39)

我担心这在设备上很难调试,因为你无法保证在你指定的时间内调用它。

setMinimumBackgroundFetchInterval表示不会在小于您指定值的间隔中调用它。但是没有setMaximumBackgroundFetchInterval。 因此,如果iOS决定每天只调用一次您的应用,甚至每周只调用一次,那么无论您的minimumBackgroundFetchInterval是什么,都不会更频繁地调用它。 AFAIK iOS决定何时通过模式调用performFetchWithCompletionHandler来衡量用户启动应用的时间和频率。

答案 2 :(得分:21)

使用您的设备,您可以按照以下步骤触发application:performFetchWithCompletionHandler

  • 将您的应用置于背景状态
  • 锁定您的设备并等待5分钟。
  • 解锁您的设备,这将触发方法

答案 3 :(得分:21)

  

(仅当我使用“XCode-&gt; Debug-&gt; Simulate模拟获取时才有效   后台获取“。)

这是因为你处于调试模式。请尝试在没有XCode的情况下启动应用程序。

答案 4 :(得分:20)

有许多注意事项:

  1. 确保在plist中设置了后台提取功能。

  2. 确保尚未针对此特定应用禁用后台提取功能,或者通常在设备的“设置”应用中禁用。

  3. 确保设置最小获取间隔。

  4. 确保您优雅地离开应用程序(例如,只需点击主页按钮并启动另一个应用程序和/或只是锁定设备)。但是,如果你杀了应用程序(双击主页按钮并向上滑动,或者你有什么),这将阻止操作系统为你的应用程序提供触发后续后台提取请求的机会(至少在用户再次运行应用程序之前) )。

  5. 确保您在物理设备上测试此内容,而不是通过Xcode调试器运行应用程序。附加到调试器会更改后台操作的行为。

  6. 确保该应用实际上正在执行一些网络请求。如果您的应用程序根本不执行任何网络请求,则它将不参与后台获取。例如,如果您使用“后台获取”的小测试应用程序并且不发出任何网络请求,则不会参与后台获取。

    同样,如果操作系统在后台模式启动您的应用程序以便它可以执行后台提取,如果您实际上没有执行网络请求,操作系统可能会停止为您的应用程序提供将来执行后台提取的功能。

  7. 确保调用完成处理程序,并在指定的时间内执行此操作,否则您的应用程序将来可能不会参与后台获取。

  8. 操作系统执行后台提取的时间取决于未来可能会发生变化的记录不完整的规则。但相关因素包括:

    • 设备是否已接通电源和/或充足电;

    • 是否连接到WiFi;

    • 用户实际启动应用的频率;

    • 设备是否正在执行其他与网络相关的任务(例如,后台提取是否可以与其他网络操作合并);

    • 过去后台获取请求的频率导致数据可用。


    根据我的经验,应用程序第一次运行后,如果连接到wifi和电源,如果你在5分钟后唤醒设备,应用程序将执行后台获取。这不是一个严格而快速的规则,而是我们过去经历过的事情。

    但许多新开发人员在Stack Overflow上发布了一些问题,例如“我怎样才能让应用程序请求数据 x 分钟(或小时)”,“我怎样才能每天凌晨2点请求数据“等等,简短的回答是,你不能。操作系统自行决定背景的时间安排。您无法控制此情况(最小请求间隔除外;但您无法控制最大间隔,因为操作系统会控制该间隔)。

  9. 这对许多人来说似乎很明显,但请确保您有一种可靠的方法来了解后台获取过程是否正确运行。用户通知框架可用于提供一些警报,以便您知道后台请求是否产生了某些内容。或者,os_log“统一通知”可用于在可在macOS Console应用上监控的设备上发布消息。但不止一次,我看到用户做了类似等待消息显示在Xcode或等待UIAlertController的事情。您需要一些在未连接到Xcode时以及应用程序永远不会进入前台时才有效的机制。

答案 5 :(得分:5)

要检查的另一件事是您的plist文件。确保UIApplicationExitsOnSuspend键不存在。

Stack Overflow上的很多人都建议使用该设置来强制您的应用在每次启动时重新开始。这确实有效,但副作用是它会阻止触发新的iOS 7后台提取功能。

答案 6 :(得分:2)

如果application: performFetchWithCompletionHandler:永远不会被解雇(除非您使用Xcode模拟它),请检查您的应用的“后台应用刷新”首选项是否为“开启”。 (设置应用 - &gt;常规 - &gt;后台应用刷新)

答案 7 :(得分:2)

此外,如果iPhone处于低功耗模式,则会禁用后台提取。

答案 8 :(得分:1)

Apple提供了一种算法,根据您自己对应用的使用情况,定义后台提取应触发的频率。如果您经常使用它,那么它将尽可能多地获取,但如果您每天下午4点使用,则后台提取应该在之前触发,因此您的数据在启动时会更新。请参阅此link