研究iOS长后台,卡壳太久了,记得是去年给某药业做一个移动外勤app,需要iOS保持后台在线。尝试了网上给出的各种方法,有的只能在插上电源的时候一直跑,但是掉了电,过不了几分钟就背杀掉了。
这里也不用iOS7的一些方法,在进入后台的时候直接申请一个后台任务。同时开启一个定时器去检测(作者给出的检测时间是1min),检测到后台任务的时间比较小的时候,转载的文章给出的值是61s。当小于这个值的时候,这个时候来播放一段无声的音乐文件。播放的同时,再来申请后台的任务,这样就不会被苹果干掉了。
但是有一个缺点,如果你的应用没有播放音乐的功能,只是为了长后台而加上,有可能是无法上架的。但是对于企业应用来说这已经足够你使用了。
1 2 3 4 5 6 7 8 9 10 11
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSError *error = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&error]; [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(tik) userInfo:nil repeats:YES]; // Override point for customization after application launch. return YES; }
|
1 2 3 4 5 6 7 8 9
| - (void)tik{ if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 61.0) { [self longTimeTask]; [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| - (void)longTimeTask { NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:@"SlientAudio" ofType:@"wav"]; //创建音乐文件路径 NSURL *musicURL = [[NSURL alloc] initFileURLWithPath:musicFilePath]; if (_myBackMusic == nil) { AVAudioPlayer *thePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:nil]; //创建播放器 self.myBackMusic = thePlayer; //赋值给自己定义的类变量 } [self.myBackMusic prepareToPlay]; //[self.myBackMusic setVolume:1]; //设置音量大小 // thePlayer.numberOfLoops = -1;//设置音乐播放次数 -1为一直循环 [self.myBackMusic play]; //播放 }
|
http://my.oschina.net/u/1386081/blog/277380
http://pan.baidu.com/s/1pJM9gSj