美文网首页iOS程序员的业余沙龙iOS奇思怪巧ios 后台运行等的其他技术点
iOS开发:后台运行以及保持程序在后台长时间运行

iOS开发:后台运行以及保持程序在后台长时间运行

作者: Levan_li | 来源:发表于2015-12-16 14:02 被阅读95537次

    第一部分

    1.先说说iOS 应用程序5个状态:

    停止运行-应用程序已经终止,或者还未启动。

    不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。

    活动-app处于“使用中”的状态。

    后台-app不再屏幕上显示,但它仍然执行代码。

    挂起-app仍然驻留内存但不再执行代码。

    按下Home键时,app从活动状态转入后台,绝大部分app通常在几秒内就从后台变成了挂起。

    在内存吃紧的时候,iphone会首先关闭那些挂起的app。

    从 iOS 4 开始,应用就可以在退到后台后,继续运行一小段时间(10 分钟);

    2.还可以把自己声明为需要在后台运行,就能不限时地运行了。

    不过限制为播放音乐、使用 GPS 、voip、。 值得一提的是,有的应用为了达到后台不限时运行的目的,在后台播放无声的音乐(审核不一定会被发现)。

    iOS 5 开始又多了一种类型:下载报刊杂志。

    然后 iOS 7 则可以下载各种玩意和定时抓取。

    iOS 7 需要注意的区别:iOS 7 以前,应用进入后台继续运行时,如果用户锁屏了,那么 iOS 会等待应用运行完,才进入睡眠状态。而在 iOS 7 上,系统会很快进入睡眠状态,那些后台应用也就暂停了。如果收到事件被唤醒(例如定时事件、推送、位置更新等),后台应用才能继续运行一会。因为处理过程变成了断断续续的,因此下载时也要使用 NSURLSession 来处理(即下文中的 Background Transfer Service)。

    3. 在我看来,苹果限制 app在后台运行,是为了更有效的利用硬件使用当前的app,不然,过多的app驻留后台,对手机资源占用是一大问题。

    二. ios7以后提供的后台接口模式

    1、Background Audio,这是后台的音频,这个很早之前便有,也是iOS设备中用得最多的后台应用,调用这个接口可以实现后台的音乐播放。

    2、Location Services,这是后台的定位,系统会拥有统一页面进行管理。

    3、VoIP,后台语音服务,类似Skype通话应用需要调用,可进行后台的语音通话。

    4、Newsstand,报刊杂志后台自动下载更新,其能够自动实时更新。

    5、Background Task  Completion,这个接口早在iOS 4时候便拥有,其可以供任意类型的APP使用,不过在旧系统中,这个接口的后台限制运行时间仅为10分钟,意味着当应用退至后台,其后台运行仅能持续10分钟便会转至休眠状态。iOS 7中对这个接口作出了改变,原来的为连续10分钟,即不论你这10分钟内用户是否关闭屏幕进入休眠状态,应用仍然会在后台等待10分钟完结后推出,而新的改进为假如遇到关闭屏幕休眠的情况,这后台运行的10分钟便会跟随一同休眠,剩余的后台时间将会留待用户再一次唤醒设备才计算。这样后台运行的时间仍然为10分钟,但并不连续,这样做的优点为省电。

    如现在有一些词典应用带有后台复制选词功能,实际上其是利用了这个接口,如果用户开启词典后并推出,即使屏幕关闭,但词典仍然在后台运行,电量消耗还是比较大的,在iOS 7上,这个问题可以得到解决。

    6、 Remote Notification,这是本次较大的一个改进接口,以往聊天类应用接受推送后点进去需要再收一次信息,这情况在QQ、微信等应用上最为明显。不过拥有了这个接口后,这情况将不复存在,以后推送将能够直接启动后台任务。值得注意的是remote notification支持silent notification(静默推送),这样dropbox这类同步应用可以在后台以最节能的模式实时静默同步了,类似布卡漫画这种也可以推送正在追的漫画的新章节并在后台静默下载,待到下载好再给用户发送一个本地推送,用户点开即看无需再联网。

    7、Background Transfer Service,后台上传下载。iOS最接近传统多任务的后台接口,可供任意类型的app调用,无时间限制。应用场景包括后台上传和下载数据,这使得游戏后台更新数据包,后台上传视频等等都成为可能,但是正如其名字,它只能用于处理上传下载这种传输类的任务,类似后台剪切板监控这种它就无能为力了。

    iOS 7新增的background fetch,这个后台接口在苹果WWDC 2013上有提及,其会根据用户行为自动调整达到效率最优的后台模式,能够处理不是很有时效性的信息获取。例如一些社交、新闻类的应用的后台信息更新,iOS系统便会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台获取频率和启动时长。

    三 .  当前社交项目,如何使用ios后台

    1.当前项目特点:

    a. 在保存长连接的情况下,用户一直在线,才能即时接收到消息;

    b. 在初始化连接的时候,需要做很多处理,如果经常连接,必然很耗电, 所以尽力在后台的时候,不是时常断开后又连接;

    2. 通过以上分析,改选用何种方式来保存app后台运行

    voip不行;

    静音播放,不清楚这种方式,是否可以通过审核;

    vpns推送,可取的方式,(具体方法: 用户在登录后,发送一个设备的tokenid; 在发送消息时,平台根据对方是离线还是在线,来判断要不要发推送消息)

    3.background fetch在该项目中的应用

    由于该app在初始化时,需要耗点时间,最好的方式就是通过  后台获取  来处理该工作,这样能保证用户的流畅体验。

    第二部分:保持程序在后台长时间运行

    iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式的“假后台”。除了系统官方极少数程序可以真后台,一般开发者开发出来的应用程序后台受到以下限制:

    1.用户按Home之后,App转入后台进行运行,此时拥有180s后台时间(iOS7)或者600s(iOS6)运行时间可以处理后台操作

    2.当180S或者600S时间过去之后,可以告知系统未完成任务,需要申请继续完成,系统批准申请之后,可以继续运行,但总时间不会超过10分钟。

    3.当10分钟时间到之后,无论怎么向系统申请继续后台,系统会强制挂起App,挂起所有后台操作、线程,直到用户再次点击App之后才会继续运行。

    当然iOS为了特殊应用也保留了一些可以实现“真后台”的方法,摘取比较常用的:

    1.VOIP

    2.定位服务

    3.后台下载

    4.在后台一直播放无声音乐(容易受到电话或者其他程序影响,所以暂未考虑)

    5….更多

    其中VOIP需要绑定一个Socket链接并申明给系统,系统将会在后台接管这个连接,一旦远端数据过来,你的App将会被唤醒10s(或者更少)的时间来处理数据,超过时间或者处理完毕,程序继续休眠。

    后台现在是iOS7引入的新API,网上实现的代码比较少,博主也没有细心去找。

    由于博主要做的App需要在后台一直运行,每隔一段时间给服务器主动发送消息来保持帐号登陆状态,因而必须确保App不被系统墓碑限制。

    博主最先尝试了很多方法,包括朋友发来的一个Demo,每180s后台时间过期就销毁自己然后再创建一个后台任务,但是实际测试只有10分钟时间。最后因为考虑到VOIP对服务端改动太大,时间又太紧,所以选择了定位服务的方法来保持后台。

    要启动定位服务:

    1.需要引入头文件:#import

    2.在AppDelegate.m中定义CLLocationManager * locationManager;作为全局变量方便控制

    3.在程序启动初期对定位服务进行初始化:

    1

    2locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate =self;//or whatever class you have for managing location

    4.在程序转入后台的时候,启动定位服务

    [locationManager startUpdatingLocation];(第一次运行这个方法的时候,如果之前用户没有使用过App,则会弹出是否允许位置服务,关于用户是否允许,后面代码中有判断)

    这样在定位服务可用的时候,程序会不断刷新后台时间,实际测试,发现后台180s时间不断被刷新,达到长久后台的目的。

    但是这样使用也有一些问题,在部分机器上面,定位服务即使打开也可能不能刷新后台时间,需要完全结束程序再运行。稳定性不知道是因为代码原因还是系统某些机制原因。

    相关文章

      网友评论

      • 飞鱼_9cc9:楼主好,我用的播放后台无声音频,但是锁屏的时候会显示个播放面板,请问有什么办法取消掉么?在线等!
        飞鱼_9cc9:@路过不错过_39c5 我也正在做,还没上线,正在审核,加个QQ吧,交流下经验,:joy: 1075353063
        路过不错过_39c5:你好,请问后台播放无声音乐可以过审吗,需要注意哪些东西
      • 时光浅影:iOS程序进入后台,延迟指定时间退出
        程序进入后台,延迟指定时间退出

        正常程序退出后,会在几秒内停止工作;
        要想申请更长的时间,需要用到
        beginBackgroundTaskWithExpirationHandler
        endBackgroundTask
        一定要成对出现

        { NSTimer *_timer;

        int aa;

        __block UIBackgroundTaskIdentifier _backIden;

        }

        - (void)applicationDidEnterBackground:(UIApplication *)application {



        [self beginTask];

        //在非主线程开启一个操作在更长时间内执行; 执行的动作

        aa =0;

        _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(go:) userInfo:nil repeats:YES];

        }



        -(void)go:(NSTimer *)tim

        {

        NSLog(@"%@==%d ",[NSDate date],aa);

        aa++;

        if (aa==9) {

        [_timer invalidate];

        [self endBack]; // 任务执行完毕,主动调用该方法结束任务

        }

        }



        -(void)beginTask

        {

        NSLog(@"begin=============");

        _backIden = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

        NSLog(@"begin bgend=============");

        [self endBack]; // 如果在系统规定时间内任务还没有完成,在时间到之前会调用到这个方法,一般是10分钟

        }];

        }



        -(void)endBack

        {

        NSLog(@"end=============");

        [[UIApplication sharedApplication] endBackgroundTask:_backIden];

        _backIden = UIBackgroundTaskInvalid;

        }
        飞鱼_9cc9:可不可以超过10分钟?在线等
        飞鱼_9cc9:请问这样审核能过吗?求答案,在线等
        时光浅影:用这种方式不知有没有缺陷?亲测有用,就是不知有没有后遗症
      • _moses:定位肯定不行吧,一定位,系统顶部就出来一个横幅,告诉用户谁在获取位置信息,这样谁还用你app啊。:unamused:
      • 李大戮:通知中心快捷回复消息应该怎么做?切后台之后没几分钟回复就不行了
      • 5859f6ff880f:楼主,我的是VoIP的APP,用到了callkit,现在就是当APP进入后台收到callkit的来电后,我直接点击挂断按钮,但当再次去呼叫的话,APP就收不到callkit的来电了,这和你说的后台持续时间有关吗
        ForestL:你好,VoIP怎样让程序在后台长期运行呢?
      • Hunter琼:你好 博主 我也是用了后台定位 有两个问题请求下1 当用户移动一定距离请求一次接口,我用的是manager.distanceFilter =100 用户移动100s 定位一次 请求一次接口 这样有没有问题?? 当然当定位是 代理方法走好几次 我进行了人为干预 2 开启定位后 退到后台 ,客户端挂起似乎需要好长时间 到底多长时间 苹果审核是不是会拒绝这样做了??
      • Mr马:当用户关闭了定位,这个方法是不是无效了
        ForestL:同问
      • sayHellooX:定位明显不行,过去不审核
      • d95405087d14:没看懂?
      • 陈藩:我的因为有个查找手机的功能,也是需要保持后台常驻的,如果主动给苹果说明可以么
      • 阿龍飛:楼主:我要做蓝牙后台一直运行;能不能用后台播放音乐一直循环达到目的。
        malgee:@一个清纯的男孩 这个没试过,一般是在连接的情况下才传输数据,你可以试试
        一个清纯的男孩:@malgee 在蓝牙没连接的情况下还能后台运行吗???你有实现过这部分的功能吗
        malgee:蓝牙支持后台运行
      • 奋斗的蝼蚁:后台10分钟 这个有依据吗
      • 480a52903ce5:博主审核通过了吗
      • 501e90a52a30:楼主 , 现在我希望的程序能在后台运行10分钟. 但是我测试的结果是, 我只能申请到3分钟的时间. 请问你知道怎么在第一次3分钟后, 怎么再次向系统申请吗? 我希望的结果是 1. 我的程序不是一直在后台, 2 我的程序在后台的时间是10分钟, 而不是 3分钟, 请问楼主, 我应该怎么做????
        若雨千寻:@4528550d2f2a 嗯,现在已改用voip push了
        4528550d2f2a:@若雨千寻 监听获取时间的倒计时,当离关闭还有10秒时再次调用申请它会在跟你申请3分钟的时间.最多不能超过10分钟.
        若雨千寻:@CC_code 我的也只能3分钟,你解决了吗?
      • guitarJason:iOS10之后,貌似后台都失效了,不管配置什么background mode都没有用,只要一点击Home键进入后台,代码就会立马停止执行了。请问你是这样的吗?
        _moses:和iOS10没关系吧,很明显的一点就是,你用导航的时候,就是息了屏也能语音播报。
        hmj1993:@wustzhy请问你是怎么实现后台一直运行的啊
        wustzhy:@guitarJason 不是这样啊,真机、模拟器 都ok的
      • Damon4Zhou:我只想说,不要搞得和Android一样,什么app都在后台运行
        东方不败撸大师:@Damon4Zhou iOS也可以看我的文章。不需要花很大时间研究他们的机制。当然希望大家遵守苹果开发原则使用。
      • Supersweet007:后台持续定位申请是通过了,不过感觉APP在十分钟之后还是会被杀死,因为我申请了十分钟的后台任务,现在我项目中有个计步器,怎么能让它一直在后台运行
        AlstonDarcy:你的问题解决了吗,我现在也需要做一个计步器,也需要后台运行。。
        Supersweet007:@RockChen 没有,我是让后台task时间到了再开启一个,这样导致了内存泄露了。。目前还没有找到好的办法,请问,怎么让后台一直定位,新手求指教
        RockChen:@Supersweet007 你的问题解决了吗?
      • 84a013fc045a:后台这块,已经被拒2次了,想采用无声播放音乐的形式达到在后台运行,第一次采用info里设置了voip服务被拒,后听人说音频要设置成audio,并提供了一栏用于播放本地音乐,之后第二次被拒给的 答复是应用程序声明支持音频UIBackgroundModes键在你的信息。plist但不包括的特性,需要持续的音频。。后面苹果打电话过来了 就是说我们app主要的目的不是为了播放音乐的。 醉了 现在也不知道 用什么办法 达到后台了
        若雨千寻:@84a013fc045a 你设置voip后程序能在后台长时间执行吗?
        hhhhhhhhhh1655:最后用什么办法解决的呢?
      • 其实爱:之前一个后台用音乐的app审核过了,只是询问了一下为何使用播放音频的backgroundMode,现在第二个上不去了,苹果说这样不符合适用规定,让我修改app,我想问一下博主,我们的应用属于物联网,跟硬件通过wifi连接的,实时读取数据,另外也有下载功能,该怎么设置UIBackgroundMode和保持持续后台呢
        84a013fc045a:@其实爱 同问解决了吗 。我现在给打回来2次了
        GodLoveNan:@纠结的哈士奇 问下,问题解决了吗? 我现在后台一直运行 但是没有数据,所有代码都不走,就是用定位做的
        纠结的哈士奇:@其实爱 mark 同遇到此问题,不过我们是蓝牙连接外设的,现在也需要后台保持运行,不知道怎么做才能过审,听你一说,用音频应该没戏了,准备用定位试试
      • 00d8ba13f2db:博主你好,用户杀进程, 调用 - (void)applicationWillTerminate:(UIApplication *)application ;方法之前也会调用- (void)applicationDidEnterBackground:(UIApplication *)application; 请问这个时候使用后台可以延时么,通过在该方法里面写- (void)applicationDidEnterBackground:(UIApplication *)application;
      • f0a4c316b9be:博主你好,后台播放音乐的Demo已经写好,但是遇到了一个问题,当我锁屏的时候,锁屏页面就会变成类似酷狗的那种播放界面,怎么让他恢复成系统的。
        7bbb72f26a5c:你是不是加了beginReceivingRemoteControlEvents这句?是的话去掉就好了
        十指恋静:@f0a4c316b9be 请问你最后是怎么解决的?
        Damon4Zhou:@f0a4c316b9be 好诡异
      • 751988baca34:我的审核通过了 但是开启了后台定位还是很快大约3分钟就会被挂起了
        阿龍飛:你好:请问你开启了哪个后台模式
      • 疯狂的Cracker:我公司app审核三次全死在这个后台定位上 :joy:
        wustzhy:@疯狂的Cracker 是Privacy - Location Always Usage Description 这个吗?添加到plist。还有其他的补充吗?我快要 迭代上架了
        疯狂的Cracker:@pointOneZero 待在那个info Plist中申明其必要性
        27bba2520ac9:@疯狂的Cracker 就算给苹果公司声明了这个功能也不行吗??
      • 无消:总结的不错
      • niuxinghua:审核大约是不通过,别问我怎么知道的。
        wustzhy:@尹_路人 我也是,2min定时器定位 并上传位置,快要迭代了,请问你怎么通过审核的啊。
        尹_路人:@niuxinghua 我是通过设置定时器,每隔两分钟触发一次启动定位的方法,以此实现app后台长驻,但是不清楚是否能通过苹果的审核
        选个昵称:@niuxinghua 你的app因为这个杯具了?
      • __下一个天亮__:楼主, 我想问一下,用定位服务保持app一直运行,审核的时候是否允许通过呢?
        wustzhy:@大黄猫咪 同问,解决了吗?怎么写的啊 :grin:
        大黄猫咪:请问应该怎么写提示损坏电池电量的问题
        Levan_li:@__下一个天亮__ 首先确定你的后台服务是非常有必要的,其次如果使用了,要向用户说明,并经的用户的同意,并提示损坏电池寿命等问题,剩下具体的就是需要用提审试一下苹果的底线了,希望对你有所帮助。
      • 444bb6bb4f18:博主,我有一个需求无论程序在前台或后台,都要把持实时刷新位置,每10分钟报一下用户所在位置.类似于滴滴打车,这个功能通过您后台定位的方法能实现吗?
        hmj1993:层主 你好 我现在也有相同的需求 请问你是如何实现的?
        danson:@学习IOS 层主 你好! 请问你的需求实现了吗? 我现在也有一个类似的需求,找不到规避的办法
        Levan_li:@学习IOS 在老的版本中,如果确实需要更多的时间去执行任务,可以调用beginBackgroundTaskWithExpirationHandler:
        新的版本中可以试着了解一下这个 Background Task Completion
      • Easy_VO:定位这个可以过审核?~
        在技术路上走到死的人:在提交应用的时候一定要说明定位用来干嘛的,不然就被kill
        FR_Zhang:如果在你的应用内没有使用的话,或者没有明确的使用地方,会被干掉
        7b802618b8b4:@Easyzhan 同问

      本文标题: iOS开发:后台运行以及保持程序在后台长时间运行

      本文链接:https://www.haomeiwen.com/subject/qcauhttx.html