我阅读了很多有关 iOS 背景知识的文章,但对于一个特定案例,我仍然无法理解概念。
当我的应用程序被 taskmanager(或由于内存压力而被 iOS 终止)并且发生重要的位置变化或地理围栏时,我的整个应用程序将由 iOS 启动并调用我的回调方法。
这里的第一个问题是:我处于什么状态?即使 UI 已部分加载,所以我有点像前景,但由于显示屏上没有任何内容,我认为它是背景。
我的第二个也是主要问题是,如果当前互联网连接中断,我如何发送 http 请求并重新发送它们?
我尝试过使用 [NSThread sleepWithInterval]
、dispatch
和 NSTimer
。所有这些都有同样糟糕的结果:它在前台工作得很好,在正常背景(用户按下主页按钮)中也很好,但在上述状态下非常糟糕。如果它们运行得足够快,我可以发送多个 http 请求,但是当我需要几秒钟的 sleep 时,我会随机被杀死。当我使用延迟 2 秒的计时器时,我能够在应用程序的所有输出停止之前到达我的“重新发送 http 请求”方法 2-3 次。如果我使用我计划的 30 秒延迟,我什至一次都不会接到计时器调用。
最后一个问题是:我需要注册后台权限吗?我已经在用了
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
或者使用 NSOperationQueue 会有帮助吗?它是否具有我没有的特殊权限?
最佳答案
您可以通过调用来检查应用程序状态
[[UIApplication sharedApplication] applicationState]
在您的情况下,它应该是 UIApplicationStateBackground
。
如果您使用 NSURLSession
进行网络请求,您可以使用后台 session 配置来设置它。当您的应用程序处于后台时,这将允许系统处理网络请求,即使您的应用程序未运行也是如此。
关于ios - ios 上的后台 http 请求为 "killed app",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35729950/