应用程序委托中performFetchWithCompletionHandler的用途是什么?

时间:2019-02-07 11:11:40

标签: ios lifecycle background-fetch

我对performFetchWithcompletionHandler如何参与iOS应用程序生命周期感到困惑。在文档中提到它给了我们30秒的时间来下载任何数据,但是那时我们的应用程序会冻结30秒吗?

2 个答案:

答案 0 :(得分:1)

这与后台获取有关,例如当应用程序收到静默通知时。在这种情况下,iOS在后台最多唤醒应用程序30秒钟。并按照作者代码进行操作,然后终止该应用程序。因此用户将不会意识到这一点。

不建议在此方法performFetchWithcompletionHandler中编写复杂的逻辑。原因是时间限制(30秒),应用程序开发人员无法控制它。

要完成这项工作,应在项目的background mode中启用capabilities

关于此示例之一是静默推送通知(通知有效负载具有键content-available = 1

有关更多详细信息,docs

答案 1 :(得分:1)

  

...那时我们的应用程序会冻结30秒吗?

不,完全相反。当您的应用暂停时,将调用此方法,但操作系统将允许您检查要检索的数据。因此,您的应用将被唤醒,在后台运行,然后将调用此方法,此时您可以执行快速获取(不超过30秒)以查看是否有任何数据可检索。完成快速提取的处理后,您将调用完成处理程序,以使操作系统知道已完成,并且可以安全地再次挂起您的应用。

但是,如果您在30秒内未能完成请求,则您的应用可能会被终止,并且不参与以后的后台抓取。因此,务必在指定的时间内完成。


the docs说:

  

如果您的应用支持提取背景模式,请实施此方法。当出现下载数据的机会时,系统会调用此方法,使您的应用有机会下载所需的任何数据。您使用此方法的实现应下载数据,准备要使用的数据,然后在completionHandler参数中调用该块。

     

调用此方法时,您的应用最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。实际上,您的应用在下载所需数据后应尽快调用完成处理程序块。如果您没有及时调用完成处理程序,则您的应用程序将终止。更重要的是,系统使用经过的时间来计算应用后台下载的耗电量和数据费用。如果您的应用需要很长的时间来调用完成处理程序,那么将来将来获取数据的机会可能会减少。有关支持后台提取操作的更多信息,请参见Background Execution中的App Programming Guide for iOS