performFetchWithCompletionHandler永远不会被解雇

2020/12/01 02:22 · ios ·  · 0评论

1)我的plist配置提供backgroundmode:

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

2)didFinishLaunchingWithOptions我有:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];

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

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

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

为什么?这是DP5 Beta错误吗?我应该雷达吗?

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

setMinimumBackgroundFetchInterval表示在小于您指定的值的间隔中不会调用它。但是没有setMaximumBackgroundFetchInterval因此,如果iOS决定每天或每周仅一次调用您的应用,那么无论您的应用是什么,它都不会被更频繁地调用minimumBackgroundFetchIntervalAFAIK iOS会performFetchWithCompletionHandler根据模式以及用户启动应用的频率来决定何时调用

在Xcode 5调试模式下,可以从菜单中强制进行后台获取:“调试”>“模拟后台获取”。

uff!

有许多注意事项:

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

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

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

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

  5. 确保您正在物理设备上对此进行测试,并且未通过Xcode调试器运行该应用程序。附加到调试器会更改后台操作的行为。

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

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

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

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

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

    • 是否连接到WiFi;

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

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

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

    以我的经验,该应用程序首次运行后,如果连接到wifi和电源,并且大约5分钟后唤醒设备,该应用程序将执行后台抓取。这不是一成不变的规则,而是我们过去的经验。

    但是许多新开发人员在Stack Overflow上发布了一些问题,例如“如何在x分钟(或小时)内获取应用程序请求数据”,“如何每天凌晨2点请求数据”等。简短的答案是,您不能。操作系统自行决定背景的时间。您无法控制此设置(除了最小请求间隔;但无法控制最大间隔,因为操作系统控制该间隔)。

  9. 对于许多人来说,这似乎很明显,但是请确保您有一种可靠的方式来了解后台获取过程是否正确运行。用户通知框架可用于呈现一些警报,以便您知道后台请求是否导致了某些情况。另外,os_log“统一通知”可用于在可在macOSConsole应用程序上监视的设备上发布消息但是不止一次,我已经看到用户做了诸如等待消息在Xcode中显示或等待的操作UIAlertController您需要一种在未连接到Xcode以及应用程序永远不会进入前台时起作用的机制。

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

这是因为您处于调试模式。请尝试不使用XCode的启动应用程序。

使用您的设备可以application:performFetchWithCompletionHandler执行以下步骤:

  • 将您的应用置于“后台”状态
  • 锁定您的设备,然后等待5分钟。
  • 解锁您的设备,这将触发该方法

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

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

如果application: performFetchWithCompletionHandler:从未解雇(除非您使用Xcode对其进行仿真),还请检查您的应用程序的“ Background App Refresh”偏好设置是否为“ On”。(设置应用->常规->后台应用刷新)

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

Apple提供了一种算法,可根据您自己对应用程序的使用情况来定义后台获取应该触发的频率。如果您经常使用它,那么它将尽可能频繁地获取数据,但是如果每天使用,例如下午4点,则后台获取操作应在之前触发,因此在启动数据时会对其进行更新。引用此链接

本文地址:http://ios.askforanswer.com/performfetchwithcompletionhandleryongyuanbuhuibeijiegu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!