关闭

关于iOS后台执行

标签: ios应用
484人阅读 评论(0) 收藏 举报
分类:

原帖地址

1.默认创建的工程,Application does not run in background默认为NO(疑), 此时的application.backgroundTimeRemaining是10,其实是9.9.然后APP在PAD上面进入后台后会挂起,然后从后台切换到前台后APP会重新激活。****问题,既然是backgroundTimeRemaining是10,为什么在后台没有运行?要切换到前台才运行?是不是因为没有添加后台的处理代码?

2.**info.plist里面添加Application does not run in background字段,此时的默认值NO,此时的application.backgroundTimeRemaining还是10,现象还是和上面的一样,进入后台会挂起,从后台切换到前台会重新激活。

3.如果Application does not run in background设置为YES,打印application.backgroundTimeRemaining还是10, 但是一切入后台,XCODE调试的工程会马上停止。

4.如果保持Application does not run in background字段的值为NO,在添加UIBackgroundModes字段,是一个数组,在下面的一项string值里面填入audio, location, voip, App processes Newsstand Kit downloads, App communicates with an accessory,CoreBluetooth任意一个。比如选audio,会自动转换成对应的值App plays audio,如果填入location,会自动更正为App registers for location updates,或者直接在右侧的选择框里面进行选择,这时候如果程序没有做这方面的处理,还是不会后台执行。我们再修改一下,填入voip,此时会自动更正为App provides Voice over IP services,此时还是不会后台执行。说明如果不在applicationDidEnterBackground加入__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:,他是不会后台执行的。

5.结合上面的分析,继续保持Application does not run in background字段的值为NO,同时在UIBackgroundModes字段中添加audio,location,voip,或者选择App processes Newsstand Kit downloads,App communicates with an accessory,App communicates using CoreBluetooth,App shares data using CoreBluetooth,总共7个,都可以开始后台执行,大概在594秒(即9.9分钟)的时候停止,与加不加相应的调用代码无关,空工程即可。

6.如果上面的代码结合使用

[[UIApplicationsharedApplication] setKeepAliveTimeout:600 handler:^{ [selfbackgroundHandler]; }];

BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^(void){
        [self backgroundHandler];//如果此时不再调用beginBackgroundTaskWithExpirationHandler,则只有10秒钟的后台执行时间了。
    }];
    if (backgroundAccepted) {
        NSLog(@"------------------------------Start new alive.");
    }
    [self backgroundHandler];

即在applicationDidEnterBackground加入上述代码,如果此时UIBackgroundModes不是voip,Xcode控制台会提示“Only VoIP apps can set KeepAliveTimeout”,会在9.9分钟即594秒的时候停止,挂起5秒钟左右的时间后,setKeepAliveTimeout起作用,继续执行。如果将此类功能应用在企业级APP上面,就可以实现在后台一直执行的APP。

打从这世界出现了操作系统以来,就没有过所谓真正的“多任务”。所谓多任务,无非是CPU速度够快而足以支撑极短时间内在多个进程内动作罢了。而所谓的“单任务”,无非是只能让当前任务独享资源罢了。
简单来说,iOS 4 app类型可以分为三种:
1. 保存现场。按下Home键10秒内直接杀死进程,并释放内存。
2. iOS支持的“多任务”。按下Home键转入多任务状态,保留在内存中,但只能系统允许的动作:比如GPS,比如VoIP,比如Streaming Music等等。
3. 真正的桌面级别的多任务。只有Safari/Mail是,苹果嫡系大都都不是。这个级别的app在后台没有任何限制动作。
无限制动作的程序,一会在用户无察觉的情况下耗光电力,二会有安全上面的问题(君还记得那些个在后台依旧默默发送你的个人消息程序吗?)
顺便提一句,后两种占用内存的app,也会在任意时间从内存中被砍掉,取决于你是否动用了其它app而导致内存不足。
真正不会被砍掉的后台,只有苹果那个通知系统。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:97832次
    • 积分:1390
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:3篇
    • 译文:21篇
    • 评论:15条
    最新评论