关于IOS后台执行

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而导致内存不足。
真正不会被砍掉的后台,只有苹果那个通知系统。

其实可以回顾一下iOS是怎么一步步引入现在这个机制的。
刚出生,什么都没有,单纯的单任务。
iPhone OS 3.0,引入通知架构,当年全部机型可用;Android晚了一年,2.2才有此功能,到这个时候相信才有90%上下机器用上。
iOS 4.0,引入有限制的后台多任务

搞这么复杂干嘛?直接像Android一出生那样所有app一个小虚拟机,无任何限制动作,让根本没有内存管理经验和资源消耗概念的全世界最大民工群Java程序员们写的app任意地跑着吧!
答案只有两个:电力,安全。安全不说,如何在保持多任务优势的同时,避免消耗过多电力,苹果花了很多心思;而不是像webOS/Android一样,简单粗暴桌面级的多任务。iPhone 4甚至在硬件上面也下了苦功,利用3D层叠技术组装A4芯片,内部元件高度集成,并把天线移至体表,增加内部电池空间。结果就是iPhone 4 1420 vs. i9000 1500。

其实至iPhone OS 3,已经足够应付大部分应用了。用户根本无从知道app的实际运行状态,保存现场让app看起来不像是刚打开一样,通知系统又可以在后台默默推送消息。事实上,当前95% iOS app依旧只有保存现场 + 通知系统这样的组合,比如很多twitter客户端,大部分人根本不会注意到它不是真正意义上的“多任务”。很震撼的事实,但确实95%的应用场景根本不需要所谓真正的“多任务”。

但是时代在变。真正需要多任务的东西出现了:电台要stream,IM要stream,GPS要stream,多任务必须提上日程。iOS 4加进了,WP7刚刚加进了,Android/webOS打一出生就有。从本质来说,iOS/WP7/Android/webOS跑在内存中的后台程序,唯一的区别就是,iOS/WP7限制了它可以做的事(这就是为什么它们一出生都没有多任务的原因,这个架构很复杂,不是几百行中文字可以说明白的),而Android/webOS没有;从技术上面来说,iOS/WP7/webOS三者架构相当,Android独立门户。

于是很可笑,有无限制,成了真“多任务”和伪“多任务”的区别;而后者架构更复杂,可以套用一句“吃力不讨好”。
为什么要做吃力不讨好的事?答案依旧在上面,电力和安全。当然你可以说iPhone电力也没好到哪里去,安全也就一般般嘛。暂且抛掉这两样不谈,实际看看iOS有限制后台app,和Android完全无限制后台app有什么不同:

相信我,最终你会发现iOS上最令人诟病的app,是那些不支持标准协议的软件平台商们,比如腾讯。因为iOS后台允许的动作,已经覆盖了全部大大小小的通信开源协议。

随便提提腾讯的QQ协议:
大家都用过很多msn/gtalk客户端,但是可能很多人都没有用过非腾讯QQ客户端(曾经有过,但是腾讯把他送进了监狱)。腾讯在QQ协议上面所做的事,一是不开放,二是隔两三个月就换一次协议,三是封杀全部三方客户端。

那么最终多任务的对比无非是,拥抱标准 vs. 允许私有。苹果作为一个弱势厂商,一直以来受够了私有标准的苦。比如一直到现在都没法用非IE支付的中国网银们,正是微软自己私有标准的后果,也是苹果为什么要开做开源WebKit的原因。软件可以封闭,硬件可以封闭,但是要拥抱标准,这是苹果的理念。

结论很简单:如果你要用一些私有协议的app(在中国我想大部分人都要用QQ的),请别看别买别关注iPhone;如果你用的都是一些拥抱标准的app,那么推荐你使用iPhone,因为它更省电更安全。关于说iOS多任务有什么用:除了不能支持私有协议外,和Android一样

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值