61

1)我的plist配置提供backgroundmode:

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

2)在didFinishLaunchingWithOptions我有:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];

UIApplicationDelegate3)我在委托中声明了协议。

4)我实现了以下方法,但它从未被解雇。(仅当我使用“XCode->Debug->Simulate Background Fetch”模拟提取时才有效。)

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

为什么?这是 DP5 测试版错误吗?我应该雷达吗?

4

9 回答 9

106

在 iOS 模拟器中运行您的应用程序,在 Xcode 调试模式下,您可以从 Xcode 菜单强制执行后台获取:

调试 > 模拟后台提取

拿来! 好小狗!

可能适用于系留设备,我最近没有尝试过。

于 2013-10-17T17:47:20.943 回答
39

恐怕这很难在设备上调试,因为您不能保证在您指定的时间内调用它。

setMinimumBackgroundFetchInterval表示它不会在小于您指定的值的间隔内调用。但是没有setMaximumBackgroundFetchInterval。因此,如果 iOS 决定每天只调用一次您的应用程序,甚至每周只调用一次,那么无论您的minimumBackgroundFetchInterval. AFAIK iOS 决定何时调用performFetchWithCompletionHandler,由用户启动应用程序的时间和频率来衡量。

于 2013-08-19T14:06:48.427 回答
35

有很多考虑:

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

  2. 确保此特定应用程序的后台获取功能没有被禁用,或者通常在设备的“设置”应用程序中。

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

  4. 确保您优雅地离开应用程序(例如,只需点击主页按钮并启动另一个应用程序和/或只是锁定设备)。但是如果你杀死了应用程序(通过双击主页按钮并向上滑动来“强制退出”,或者对于那些没有主页按钮的设备,从底部向上滑动以拉出任务管理器,然后在应用程序上向上滑动问题),这将阻止操作系统为您的应用程序提供触发后续后台获取请求的机会(至少在用户再次运行应用程序之前)。

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

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

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

  7. 确保调用完成处理程序,并在分配的时间内这样做,否则您的应用将来可能不会参与后台获取。

  8. 操作系统执行后台获取的时间是由记录不充分的规则决定的,这些规则将来可能会改变。但相关因素包括:

    • 设备是否已连接电源和/或是否充满电;

    • 是否连接WiFi;

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

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

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

    以我的经验,应用程序第一次运行后,如果连接到 wifi 和电源,如果您在大约 5 分钟后唤醒设备,应用程序将执行后台获取。这不是一个硬性规定,而是我们过去所经历的。

    但是许多新开发人员在 Stack Overflow 上发布了诸如“我如何每x分钟(或几小时)获取应用程序请求数据”、“我如何才能在每天凌晨 2 点请求数据”等问题。简短的回答是你不能。操作系统自行决定后台的时间安排。您无法控制这一点(除了最小请求间隔;但您无法控制最大间隔,因为操作系统可以控制)。

  9. 这对许多人来说似乎很明显,但请确保您有一种可靠的方法来了解后台获取过程是否正确运行。用户通知框架可用于显示一些警报,以便您知道后台请求是否导致某些事情。或者,os_log也可以使用Logger“统一日志记录”(参见 WWDC 2016统一日志记录和活动跟踪或 2020 年探索 Swift 日志记录)在设备上发布可以在 macOSConsole应用程序上监控的消息。但不止一次,我看到用户做一些事情,比如等待消息出现在 Xcode 中或等待UIAlertController. 您需要一些在未连接到 Xcode 并且应用程序从不进入前台时工作的机制。

于 2017-07-10T00:18:10.380 回答
23

(仅当我使用“Xcode->Debug->Simulate Background Fetch”模拟提取时才有效。)

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

于 2014-05-23T16:21:28.140 回答
23

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

  • 将您的应用置于后台状态
  • 锁定您的设备并等待 5 分钟。
  • 解锁您的设备,这将触发该方法
于 2013-10-30T13:47:27.623 回答
5

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

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

于 2013-10-30T21:23:29.023 回答
3

如果application: performFetchWithCompletionHandler:从未被触发(除非您使用 Xcode 模拟它),请检查您的应用程序的“后台应用程序刷新”首选项是否为“开启”。(设置应用 -> 常规 -> 后台应用刷新)

于 2014-05-14T13:09:58.153 回答
2

此外,如果 iPhone 处于低功耗模式,后台获取将被禁用。

于 2016-10-11T01:25:09.837 回答
1

Apple 提供了一种算法,该算法根据您自己对应用程序的使用情况定义后台提取应该触发的频率。如果你经常使用它,那么它会尽可能频繁地获取,但是如果你每天下午 4 点使用 like,后台获取应该在之前触发,所以当你启动它时你的数据会更新。

于 2014-06-03T11:14:08.763 回答