IOS系统本身支持多任务,但是苹果出于对电量的控制,当用户按下home键后,切到后台的app一般就被系统pend了;前面提到一般,就说明还有不一般的app,到底是什么类型的app,这里不做说明。如何让一般的app可以在后台永久的运行呢?办法就是将一般的app处理成苹果允许后台运行的“不一般”的app。
我这里有两个办法:
1、使用一个无声的音频文件,当app切换到后台后就开始无限循环播放。这样你的app就永远在后台活着了,你在后台想做什么,都可以。
2、循环向系统申请“任务时间片“,也能保证你的app就永远在后台活着。
对比而言,第二种办法较为妥当(第一种可能被来电或者其他播放软件打断)。下面是操作代码:
在你app的程序代理实现文件中添加红色显示的代码(验证下吧,添加个定时器,看看是不是切换到后台后永远跑着)
#import "MQLAppDelegate.h"
@interface MQLAppDelegate ()
//时间片标识begin
@property UIBackgroundTaskIdentifier newtaskID;
@property UIBackgroundTaskIdentifier oldtaskID;
//时间片标识end
@end
@implementation MQLAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//时间片标识begin
self.newtaskID = self.oldtaskID = UIBackgroundTaskInvalid;
//时间片标识end
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
//时间片标识begin
self.newtaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
if (self.newtaskID != UIBackgroundTaskInvalid && self.oldtaskID != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask: self.oldtaskID];
}
self.oldtaskID = self.newtaskID;
//时间片标识end
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
//时间片标识begin
if (self.oldtaskID != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask: self.oldtaskID];
self.oldtaskID = UIBackgroundTaskInvalid;
}
//时间片标识end
}
@end
@interface MQLAppDelegate ()
//时间片标识begin
@property UIBackgroundTaskIdentifier newtaskID;
@property UIBackgroundTaskIdentifier oldtaskID;
//时间片标识end
@end
@implementation MQLAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//时间片标识begin
self.newtaskID = self.oldtaskID = UIBackgroundTaskInvalid;
//时间片标识end
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
//时间片标识begin
self.newtaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
if (self.newtaskID != UIBackgroundTaskInvalid && self.oldtaskID != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask: self.oldtaskID];
}
self.oldtaskID = self.newtaskID;
//时间片标识end
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
//时间片标识begin
if (self.oldtaskID != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask: self.oldtaskID];
self.oldtaskID = UIBackgroundTaskInvalid;
}
//时间片标识end
}
@end