ios上针对“已终止应用程序”的后台http请求
Posted
技术标签:
【中文标题】ios上针对“已终止应用程序”的后台http请求【英文标题】:background http requests on ios for "killed app" 【发布时间】:2016-03-01 17:55:09 【问题描述】:我阅读了很多关于 ios 后台的信息,但对于一个特定案例的概念,我仍然无法理解。
当我的应用被任务管理器(或由于内存压力而被 iOS 杀死)并且发生显着的LocationChange 或 GeoFence 时,我的整个应用由 iOS 启动并调用我的回调方法。
这里的第一个问题是:我处于什么状态?甚至 UI 也被部分加载,所以我是一种前景,但由于显示屏上没有任何内容,我认为它是背景。
我的第二个也是主要问题是,如果当前互联网连接中断,我如何发送 http 请求并重新发送它们?
我尝试使用 [NSThread sleepWithInterval]
、dispatch
延迟和 NSTimer
。所有这些都具有相同的糟糕结果:它在前台运行良好,在正常背景下运行良好(用户按下主页按钮),但在上述状态下非常糟糕。如果它们运行得足够快,我可以发送多个 http 请求,但是当我需要几秒钟的睡眠时,我会被随机杀死。当我使用具有 2 秒延迟的计时器时,我能够在应用程序的所有输出停止之前达到我的“重新发送 http 请求”方法 2-3 次。如果我使用我计划的 30 秒延迟,我什至没有接到一次计时器调用。
所以最后一个问题是:我需要注册一个后台权限吗?我已经用过了
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
或者使用 NSOperationQueue 会有所帮助吗?它有我没有的特殊权限吗?
【问题讨论】:
【参考方案1】:您可以通过调用检查应用程序状态
[[UIApplication sharedApplication] applicationState]
在你的情况下应该是UIApplicationStateBackground
。
如果您对网络请求使用NSURLSession
,则可以使用后台会话配置对其进行设置。当您的应用处于后台时,这将允许系统处理网络请求,即使您的应用未运行。
【讨论】:
感谢您的回答。我能够看到,我真的在后台(枚举 2),至少知道这一点很高兴。 但是对于你的另一点,我已经在使用 NSURLSession,问题是,我仍然需要一个 Timer 或类似的东西来调用执行 NSURLSession 的方法。而且似乎在计时器触发之前应用程序已经死了。 没有办法解决这个问题,您的应用只能在后台运行一小段时间。由于我不知道您为什么要添加计时器,所以我会说尝试在不使用计时器的情况下解决问题。 您有什么建议吗?我对任何解决方案持开放态度,我认为这应该是一项非常简单的任务,我想要实现的只是在 HTTP 请求失败后稍作延迟后重试(很可能是因为连接问题)。但即使应用程序被终止,它们也会在后台发送地理更新。 使用后台 url 会话,它在运行请求之前等待良好的互联网连接。以上是关于ios上针对“已终止应用程序”的后台http请求的主要内容,如果未能解决你的问题,请参考以下文章
iOS BLE Scanning with (user) kill App
在 iPhone 后台使用 http 请求下载文件(iOS 4.0 以上)