iOS程序进入后台后仍运行定时器NSTimer

iOS 允许的几种后台

几种后台存活的模式 
ios7之后(一个app可以混合调用多种模式):Background Audio、VoIP、Location Services、Newsstand、Background Task Completion、Background Fetch 、Remote Notification、Background Transfer Service 
Background Audio,VoIP 
属于不后台会死的类型; 
Location Services 
是地点服务,系统统一管理; 
Newsstand 
是苹果自家应用,定时更新。这些都是早就有,没变化。 
Background Task Completion 
ios4中开始加入的限时后台,允许应用连续后台十分钟,ios7改为允许在开屏下运行十分钟,关屏会暂停,直到开屏后重启继续凑足十分种。 
Background Fetch  
ios7新增,在系统认为合适的时候激活应用,具体什么时候合适,开发者不可知,使用者不可控,由系统智能判断,适合获取及时性不强的信息。这个智能体现在系统会根据用户启动应用的频率和时间以及当前的网络和电量情况来分配每个应用的获取频率和时间,数据刷新是统一的,即系统可以在一个进程内获取多个应用所需的数据而不是一个应用一个进程(类似统一的推送机制,都是为了省电) 
统一刷新这方面有点类似小米说的对齐唤醒和Deep Sleep Battery Saver,不同应用后台唤醒时刻不同会导致cpu无法进入deep sleep,某些Android用户会发现自己的手机一夜掉电超多,其实就是某些糟糕的app让cpu没睡好:-) 
Remote Notification 
ios7新增,由统一推送通知激活后台,支持silent notification,适合实时类强的应用,有频率限制(每小时几次) 
Background Transfer Service 
ios7新增,可以由应用直接激活的无限制后台,权限大,但是只限于下载上传类服务,只会在 WiFi 环境下才进行传输 
需要特别注意的是:应用被Background Fetch、Remote Notification、Background Transfer Service三类唤醒时,只被给予几秒钟时间来处理更新。 
可以看到对于Remote Notification和Background Transfer Service还是有一定风险的。苹果说会记录每次操作的时间,从而对应用进行监管,具体怎样,可观后效~ 
几个常见应用的后台模式 
1.QQ音乐等音乐软件的锁屏界面显示歌词其实就是不断更换新的锁屏图片的水印。PP助手的锁屏界面显示下载进度也是同理。 
2.有的软件为了实现后台下载,会在按下home键之后在后台默认播放空白音乐,这样系统本身就会识别为音乐,不会在按下home键之后将它关闭了。 
3.大部分杀内存软件是软件本身先产生大量数据占用大部分内存来使iOS自身释放空闲内存,然后软件本身再恢复正常的内存占用。 
4.iPhoneQQ即使关闭后台之后仍然杀不掉线,因为iOS版本的QQ即使手机后台关闭,腾讯后台也会自动默认在线48小时,软件本身和软件的通知是独立的,所以能正常接收推送(2011年6月份之前iPhone版QQ是按下home键自动离线的,但是可以接收消息)。 
5.因为流量监测软件不能像安卓一样在后台驻留,为了实现流量监测功能,它会在第一次开启软件时读取系统当前的蜂窝数据用量,然后在第二次打开软件时再读取当前系统的蜂窝数据用量,相减之后得出这一段时间的蜂窝数据用量。 
6.关于软件评分,有的游戏会弹出评分请求,在AppStore里评分完之后会给一些游戏奖励,实际上那些软件是无法检测到你有没有评分,有没有好评。只是给你提供一个弹窗,你点出去然后再打开这个软件即使不评分照样也可以获得奖励。 
7.各种手机助手不越狱也可以安装所谓的正版软件,这是通过漏洞绕过了iTunes来使用一个账号授权无数个及其(原本一个iTunes账号最能授权5个机器),这其实也是属于盗版,而且当你再次通过自己的账号在AppStore中下载安装软件之后,之前通过各种助手下载的那些软件会出现闪退,需要重新授权。 
8.各种电池助手电池管家只能在检测到你的充电状态后给你播放一个屏保,记录一下充电时间,他们并不能该读取电池参数,而且也无法对你的电池起到什么保护作用,计算的剩余充电时间也是不准确的(越狱后可以安装BatteryDetective来检测实际电池容量)。

Required background modes { 
App plays audio or streams audio/video using AirPlay 
App registers for location updates 
App provides Voice over IP services 
App processes Newsstand Kit downloads 
App communicates with an accessory 
App communicates using CoreBluetooth 
App shares data using CoreBluetooth 
App downloads content from the network 
App downloads content in response to push notifications 

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调用,无时间限制。应用场景包括后台上传和下载数据,这使得游戏 后台更新数据包,后台上传视频等等都成为可能,但是正如其名字,它只能用于处理上传下载这种传输类的任务,类似后台剪切板监控这种它就无能为力了。 


现在以其中最常见的为例简单介绍一下后台定位

后台定位

步骤一:

将plist文件中加入Required background modes 
App registers for location updates 
添加后是这样的



步骤二:

步骤三:将以下代码添加到appDelegate文件中的- (void)applicationDidEnterBackground:(UIApplication *)application函数,也可添加到在具体类中注册的应用进入后台后的通知方法

扫描二维码关注公众号,回复: 2854655 查看本文章

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

    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
}


完成以上步骤你会发现,程序进入后台后仍可运行定时器

猜你喜欢

转载自blog.csdn.net/qq_33226881/article/details/78569076