2016-03-01 78 views
1

我读了很多关于iOS背景知识,但我仍然有理解概念的概念。背景http请求ios上的“杀死应用程序”

当我的应用程序因taskmanager(或由于内存压力而被iOS所杀)并发生了significantLocationChange或GeoFence时,我的整个应用程序都由iOS启动,并调用我的回调方法。

这里第一个问题是:我在什么状态?即使是用户界面部分加载,所以我是前景,但由于显示屏上没有任何东西,我认为它是背景。

我的第二个和主要问题是,如何发送http请求并重新发送它们,如果互联网连接当前关闭?

我试过使用[NSThread sleepWithInterval],dispatch延迟和NSTimer。它们都具有相同的不良结果:它在前景中效果很好,在NORMAL背景下很好(用户按下homebutton),但在上述状态下效果很差。如果运行速度足够快,我可以发送多个http请求,但当我需要几秒钟睡眠时,我会随机杀死。当我使用2秒延迟的定时器时,我能够达到我的“重新发送http请求”方法2-3次,让所有输出的应用程序停止。如果我使用我计划的30秒延迟,我甚至不会收到一次定时器呼叫。

所以最后一个问题是:是否有我需要注册的背景权限?我已经使用

<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
</array> 

或者它会帮助使用NSOperationQueue?它有我没有的特殊权限吗?

回答

1

你可以通过调用

[[UIApplication sharedApplication] applicationState] 

在你的情况检查应用程序的状态应该是UIApplicationStateBackground。如果您使用的是您的网络请求NSURLSession


,你可以用一个后台会话配置设置。当您的应用程序处于后台时,即使您的应用程序未运行,这也将允许系统处理网络请求。

+0

Thx为您的答案。我能够看到,我真的在后台(枚举2),至少这是很好的知道。 – Jens

+0

但是对于你的另一点,我已经使用NSURLSession,问题是,我仍然需要一个定时器或类似的,将调用NSURLSession的方法。而且看起来应用程序在计时器触发之前就已经死了。 – Jens

+1

这是没有办法的,你的应用程序只能获得少量的时间在后台运行。因为我不知道你为什么试图添加一个计时器,所以我会说,不使用计时器就可以解决问题。 –