我阅读了很多关于iOS背景知识的内容,但我仍然对一个特定案例的概念有所了解。
当我的应用程序被taskmanager(或由于内存压力而被iOS)杀死并且发生了一个significantLocationChange或GeoFence时,我的整个应用程序都是由iOS启动的,并调用了我的回调方法。
这里的第一个问题是:我处于什么状态?即使UI部分加载,所以我有点前景,但由于显示器上没有任何内容,我认为它是背景。
我的第二个主要问题是,如果互联网连接目前停止,我该如何发送http请求并重新发送?
我尝试使用[NSThread sleepWithInterval]
,dispatch
延迟和NSTimer
。所有这些都有相同的不良结果:它在前景中效果很好,在NORMAL背景中很好(用户按下homebutton)但在上述状态下非常糟糕。我能够发送多个http请求,如果它们运行得足够快,但是当我需要几秒钟的睡眠时,我会被随机杀死。当我使用具有2秒延迟的定时器时,我能够达到我的“重新发送http请求”方法2-3次bevor应用程序的所有输出停止。如果我使用计划的30秒延迟,我甚至不会接到一次定时器调用。
所以最后一个问题是:我是否需要注册后台许可?我已经使用
了<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
或者使用NSOperationQueue会有帮助吗?它是否具有我没有的特殊权限?
答案 0 :(得分:1)
您可以通过调用
来检查应用程序状态[[UIApplication sharedApplication] applicationState]
在您的情况下,它应该是UIApplicationStateBackground
。
如果您使用NSURLSession
进行网络请求,则可以使用后台会话配置进行设置。当您的应用在后台时,即使您的应用未运行,也可以让系统处理网络请求。