iOS 长后台

研究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