当前位置: 首页 > 知识库问答 >
问题:

PerformFetchwith CompletionHandler永远不会被解雇

宰父君昊
2023-03-14

1)我的plist配置提供背景模式

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

2) 在didfishlaunchingwithoptions中,我有:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];

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

4)我实现了以下方法,但它永远不会被触发。(只有当我用“XCode-”模拟获取时才有效

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

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

共有3个答案

公孙志
2023-03-14

有很多考虑:

>

确保没有为此特定应用禁用后台提取功能,或者在设备的设置应用中禁用后台提取功能。

确保设置最小获取间隔。

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

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

确保应用程序正在执行一些网络请求。如果你的应用程序根本不执行网络请求,它就不会参与后台获取。例如,如果你做了一个带有“后台抓取”的小测试应用,并且没有发出任何网络请求,你就不会参与后台抓取。

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

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

操作系统执行后台提取的时间由文档记录不佳的规则决定,这些规则将来可能会改变。但相关因素包括:

>

是否连接到WiFi;

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

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

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

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

但许多新开发人员在Stack Overflow上发帖,问了一些问题,比如“我怎么能在x分钟(或小时)内获得应用程序请求数据”、“我怎么能每天凌晨2点请求数据”等等。简单的回答是,你不能。操作系统自行决定后台的时间。您无法控制这一点(除了最小请求间隔;但您无法控制最大间隔,因为操作系统会控制它)。

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

仉昂熙
2023-03-14

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

如果iOS决定一天调用一次,甚至一周调用一次,那么无论你的代码是多少,它都不会被更频繁地调用。AFAIKiOS决定何时调用performFetchSusCompletionHandler,该模式由用户启动应用的时间和频率来衡量。

傅越
2023-03-14

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

调试

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

 类似资料:
  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 我得到了一个具有多个EditText-字段的。当我尝试编辑其中一个-字段并单击虚拟键盘上的回车键时,焦点向下转移到下一个-字段,这是我不想发生的事情。我想提交我在第一个-字段中所做的更改,然后关闭键盘。我设法通过在我的. xml文件中添加以下内容来关闭这个焦点转移: 但问题仍然存在,现在更改从未提交,因为我的侦听器从未被调用。如果我在我的中删除除一个项目之外的所有项目,一切都会正常工作。我的中也有

  • 我在Visual Studio 2017 Update 3预览版中有以下解决方案,它由作为NetStandard1.4的Xamarin.Forms项目和NetStandard1.4 dotnet Core Services.API项目以及NetStandard1.6 dotnet Core单元测试项目组成。 单元测试项目仅引用服务项目。csproj文件如下所示,其中添加了用于单元测试的MSTest

  • 我还尝试使用而不是提取ZIP归档,但随后出现以下错误: ZIP文件没有问题,我已经在Mac OSX上用测试了它。我还尝试使用ZIP版本3.0和2.1(最初是2.0)重新压缩它。我可以在Mac OSx上解压所有版本而没有任何问题(使用Unarchiver和Archive实用程序)。 这快把我逼疯了,可能会有什么错? 我在解压压缩文件之前从服务器下载这些压缩文件,显然我忘记在开始解压操作之前调用下载操

  • 问题内容: 我正在开发游戏,但扫描仪遇到了一个小问题。我收到了一个从未关闭过的资源泄漏扫描程序。 但是我认为我的扫描仪在没有关闭之前就可以正常工作。但是现在不是。有人可以帮我吗? 问题答案: 我假设您正在使用Java 7,因此会收到编译器警告,当您不关闭资源时,通常应在finally块中关闭扫描程序。 甚至更好:使用新的 Try with resource语句 :

  • 问题内容: 我正在使用Flask-WTF: 这是我的表格: 这是控制器: 现在的问题是,如果您查看我的打印语句,它将始终打印已提交的内容,但从不打印有效的内容,并且永远不会执行validate_on_submit()。为什么? 问题答案: 您没有在HTML表单中插入CSRF字段。 添加到模板(docs)后,表单将按预期验证。 验证表单后添加,以查看出现的错误。 在验证之前将为空。在这种情况下,会出