在我看來,蘋果系統(tǒng)與安卓系統(tǒng)最直觀的區(qū)別就是后臺(tái)處理方式了吧,安卓手機(jī)一旦開啟了很多app放到后臺(tái),即使前臺(tái)什么也不做,就是切換一下系統(tǒng)界面都會(huì)覺得卡;蘋果手機(jī)不論開多少app在后臺(tái)都感覺很流暢.
這是因?yàn)榘沧磕J(rèn)處理app為真后臺(tái),可以一直在后臺(tái)處理操作;
而iOS為了讓設(shè)備盡量省電座享,減少不必要的開銷喜最,保持系統(tǒng)流暢陨晶,因而對(duì)后臺(tái)機(jī)制采用墓碑式的“假后臺(tái)”。除了系統(tǒng)官方極少數(shù)程序可以真后臺(tái)放吩,一般開發(fā)者開發(fā)出來的應(yīng)用程序后臺(tái)受到以下限制:
1.用戶按Home之后,App轉(zhuǎn)入后臺(tái)進(jìn)行運(yùn)行,此時(shí)擁有180s后臺(tái)時(shí)間(iOS7)或者600s(iOS6)運(yùn)行時(shí)間可以處理后臺(tái)操作
2.當(dāng)180S或者600S時(shí)間過去之后县忌,可以告知系統(tǒng)未完成任務(wù)僧凰,需要申請(qǐng)繼續(xù)完成慷妙,系統(tǒng)批準(zhǔn)申請(qǐng)之后,可以繼續(xù)運(yùn)行允悦,但總時(shí)間不會(huì)超過10分鐘
3.當(dāng)10分鐘時(shí)間到之后膝擂,無論怎么向系統(tǒng)申請(qǐng)繼續(xù)后臺(tái),系統(tǒng)會(huì)強(qiáng)制掛起App隙弛,掛起所有后臺(tái)操作架馋、線程,直到用戶再次點(diǎn)擊App之后才會(huì)繼續(xù)運(yùn)行
iOS系統(tǒng)app如何實(shí)現(xiàn)在后臺(tái)長(zhǎng)時(shí)間運(yùn)行
比較常用的可以實(shí)現(xiàn)“真后臺(tái)”的方法:
1.VOIP 2.定位服務(wù) 3.后臺(tái)下載 4.在后臺(tái)循環(huán)播放無聲音樂
目前我接手的項(xiàng)目是視頻點(diǎn)播類項(xiàng)目,需要在app進(jìn)入后臺(tái)也可以保持電視播放劇集,并在回到前臺(tái)后更新進(jìn)度條進(jìn)度,并且每60s對(duì)后臺(tái)發(fā)送心跳包,保持長(zhǎng)連接,所以需要實(shí)現(xiàn)真后臺(tái).
使用了第4種方式,靜音播放,上架之前多次被拒但最終通過了審核.
如何通過了審核
上架的時(shí)候,標(biāo)注是視頻點(diǎn)播類app,此app類似于電視遙控器,
起初一進(jìn)入后臺(tái)就循環(huán)播放無聲音樂,所以蘋果方一直以播放視頻和音頻沒有聲音拒絕.
但是為了保持真后臺(tái),必須是類似音樂播放器一類的可以后臺(tái)播放聲音的app.
所以第一次上架時(shí),點(diǎn)擊播放后退到后臺(tái)會(huì)在后臺(tái)循環(huán)播放一個(gè)有聲音的MP3,
在通過了審核后,立刻更新一個(gè)版本,把有聲音的MP3文件換成一個(gè)無聲音的MP3
此時(shí)蘋果測(cè)試人員審核不會(huì)像第一次審核那么嚴(yán)格,通過了.
具體實(shí)現(xiàn):首先我們看看app進(jìn)入后臺(tái)進(jìn)入前臺(tái)的幾個(gè)常用方法
#pragma mark - 程序?qū)⒁M(jìn)入后臺(tái)(墓碑狀態(tài))
- (void)applicationWillResignActive:(UIApplication *)application {
}
#pragma mark - 程序進(jìn)入后臺(tái)
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
#pragma mark - 程序?qū)⒁M(jìn)入前臺(tái)
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
#pragma mark - 程序進(jìn)入前臺(tái)
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
配置plist文件背景播放的支持:
在AppDelegate中實(shí)現(xiàn)大概:
//進(jìn)入后臺(tái)
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"%s",__FUNCTION__);
//設(shè)置永久后臺(tái)運(yùn)行
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
//不管有沒有完成全闷,結(jié)束bgTask任務(wù)
[application endBackgroundTask:bgTask];
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;
}
});
});
//當(dāng)只有點(diǎn)播了時(shí)才會(huì)退到后臺(tái)叉寂,如果不點(diǎn)播則后臺(tái)不開啟,以省電
if ([CJGloblePlayer defaultGloblePlayer].runningPlayer.isPlaying)
{
//開啟后臺(tái)任務(wù)
[self applyBackgrounTaskTime];
//UI停止更新
[[CJTopPlayView sharePlayView].rotaionView stopRotation];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Starting background task with %0.1f seconds remaining", application.backgroundTimeRemaining);
[NSThread sleepForTimeInterval:600];
NSLog(@"Finishing background task with %0.1f seconds remaining",application.backgroundTimeRemaining);
//告訴系統(tǒng)我們完成了 也就是要告訴應(yīng)用程序:“好借好還”嘛总珠。
//將任務(wù)標(biāo)記為完成
[application endBackgroundTask:bgTask];
// 銷毀后臺(tái)任務(wù)標(biāo)識(shí)符
bgTask = UIBackgroundTaskInvalid;
});
}
//開啟后臺(tái)任務(wù)
- (void)applyBackgrounTaskTime
{
//__block UIBackgroundTaskIdentifier background_task;
UIApplication *application = [UIApplication sharedApplication];
//注冊(cè)一個(gè)后臺(tái)任務(wù)屏鳍,告訴系統(tǒng)我們需要向系統(tǒng)借一些事件
background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
//不管有沒有完成勘纯,結(jié)束background_task任務(wù)
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
}];
//異步
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//### background task starts
NSLog(@"Running in the background\n");
//循環(huán)播放無聲的MP3
[[CJBackGroundAudioVC shareInstance] backGroundStart];
[NSThread sleepForTimeInterval:2];
//結(jié)束background_task任務(wù)
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
});
}
//播放MP3
- (void)backGroundStart
{
[self playAudio:[[NSBundle mainBundle] pathForResource:@"silence" ofType:@"mp3"]];
}
//程序進(jìn)入前臺(tái)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
//后臺(tái)保持app一直運(yùn)作的播放器停止工作
[[CJBackGroundAudioVC shareInstance] backGroundStop];
//全局播放器開始播放,更新UI
if ([CJGloblePlayer defaultGloblePlayer].runningPlayer.playstate == psPlaying)
{
[[CJTopPlayView sharePlayView].rotaionView startRotation];
}
}
若有不妥之處,恭請(qǐng)?jiān)u論多多指教.
參考相關(guān)鏈接:
http://www.reibang.com/p/174fd2673897
http://blog.csdn.net/weiwangchao_/article/details/8316641