iOS保持App真后臺(tái)運(yùn)行

在我看來,蘋果系統(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钓瞭,隨后出現(xiàn)的幾起案子驳遵,更是在濱河造成了極大的恐慌,老刑警劉巖山涡,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堤结,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸭丛,警方通過查閱死者的電腦和手機(jī)竞穷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳞溉,“玉大人瘾带,你說我怎么就攤上這事∈旆疲” “怎么了看政?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)科盛。 經(jīng)常有香客問我帽衙,道長(zhǎng),這世上最難降的妖魔是什么贞绵? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任厉萝,我火速辦了婚禮,結(jié)果婚禮上榨崩,老公的妹妹穿的比我還像新娘谴垫。我一直安慰自己,他們只是感情好母蛛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布翩剪。 她就那樣靜靜地躺著,像睡著了一般彩郊。 火紅的嫁衣襯著肌膚如雪前弯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天秫逝,我揣著相機(jī)與錄音恕出,去河邊找鬼。 笑死违帆,一個(gè)胖子當(dāng)著我的面吹牛浙巫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼的畴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼渊抄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丧裁,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤护桦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后渣慕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘶炭,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抱慌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年逊桦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抑进。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡强经,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寺渗,到底是詐尸還是另有隱情匿情,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布信殊,位于F島的核電站炬称,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涡拘。R本人自食惡果不足惜玲躯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳄乏。 院中可真熱鬧跷车,春花似錦、人聲如沸橱野。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽水援。三九已至密强,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜗元,已是汗流浹背或渤。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留许帐,地道東北人劳坑。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像成畦,于是被迫代替她去往敵國(guó)和親距芬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涝开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 第一部分 1.先說說iOS 應(yīng)用程序5個(gè)狀態(tài): 停止運(yùn)行-應(yīng)用程序已經(jīng)終止,或者還未啟動(dòng)框仔。 不活動(dòng)-應(yīng)用程序處于前...
    Levan_li閱讀 139,231評(píng)論 119 204
  • 前言 對(duì)于APP的前后臺(tái)運(yùn)行情況的了解舀武,有助于我們?cè)趯?shí)際開發(fā)中規(guī)避一些問題,以及采取穩(wěn)妥的方法處理和解決問題离斩,是很...
    進(jìn)無盡閱讀 3,008評(píng)論 7 12
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)银舱、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 十八年前的一天跛梗,你生病了寻馏,媽媽買了好多藥你吃了不見好,某日的放學(xué)回家聽說你住院了核偿,那一別卻是永生~ 從你住院距離你...
    姣_d051閱讀 504評(píng)論 0 0
  • 為什么關(guān)羽比張飛死得早诚欠? 神回復(fù):紅顏薄命唄…… 給你一個(gè)在地球上增加一個(gè)新物種的機(jī)會(huì),你會(huì)設(shè)計(jì)個(gè)什么樣的生物呢漾岳?...
    哆得閱讀 396評(píng)論 0 1