iO后臺模式開發(fā)

1. 后臺駐留

iOS 中所謂的「后臺駐留」并不是指「執(zhí)行中的程序」,而是「最近使用過的程序」
Apple 的知識庫文章解釋:
  • 按兩下主畫面按鈕后,顯示的是「最近用過的應用程序」,所以別把它想成Mac OS X 中的Command + Tab 鍵所顯示的切換程序列。

  • 你可以試試看將iPhone 關機再開機,然后按兩下 Home 鍵,應該會發(fā)現(xiàn)先前那些程式還是出現(xiàn)在那里,因為它其實是你最近使用過的程序使用記錄,或像是瀏覽器中的瀏覽記錄。

  • 如果你一個一個去清除 "后臺駐留" 的程序,就像是一筆一筆刪除瀏覽記錄中的項目一樣,是沒有太大意義的(除非你不想讓其他人看到你曾經(jīng)用過什么程式,或者想殺時間、太無聊了),也不會對電力或記憶體有什么幫助。

  • iOS 的多任務處理其實是很聰明的,系統(tǒng)會自動中止在背景執(zhí)行的程序,在有需要時,也會將被中止的程式 suspended(掛起)(注:"中止的程式"不是指關閉程序,而是指由前臺轉向后臺的程序,程序在后臺并不真正運行,不要和關閉程序混淆了) 從內(nèi)存中移除。因此,iOS 裝置的使用者根本就不需要擔心怎么管理這些執(zhí)行中或不在執(zhí)行中的程序。

所以點擊兩下Home之后顯示的是記錄,并且這些記錄是有的是掛起狀態(tài),也有應用因為內(nèi)存吃緊而被關閉,當你將應用劃出記錄的時候,其實做的是兩個操作。
  • 清除記錄

  • 完全關閉應用(關閉進程)

2.掛起

一般說來,所有程式進入背景后都還有1-5秒的執(zhí)行緩沖時間(視內(nèi)存壓力而決定),有些程序可以要求延長到10 分鐘(這些當然是由開發(fā)人員在設計與提交程式時決定和聲明),因此,在你按下 Home 鍵后,本來的程式就會退到后臺,如果它有額外的后臺執(zhí)行作業(yè),超過10分鐘還是會被 iOS 中止,但是,也有例外情況,某些特殊類型的程式是被容許在背景中持續(xù)執(zhí)行的,像是會持續(xù)在背景播放音樂的程序、GPS 程序、VOIP 程序、Newsstand 以及周邊配件附屬的程序,不過只要這些程序不再執(zhí)行動作,就會變成中止的程式,像是音樂撥完了、雜志下載完了。
既然是多任務你應該會在應用進入后臺時做一些處理,比如暫停一些界面的定時刷新或網(wǎng)絡請求。同時,或者你會在程序進入前臺時執(zhí)行一些恢復操作。
  • <p> 在你的應用的application delegate里有2個消息用于處理這些消息:</p>
- (void)applicationDidEnterBackground:(UIApplication*)application
{
    //進入后臺時要進行的處理 
}
- (void)applicationWillEnterForeground:(UIApplication*)application  
{  
    //進入前臺時要進行的處理  
}  

3.延長程序掛起的時間(最多十分鐘)

調用UIApplication的
eginBackgroundTaskWithExpirationHandler

方法,可以讓 app 最多有10分鐘的時間在后臺長久運行

  • <p> 首先:聲明一個實例 <p>
@interface AppDelegate ()  
{  
    //用來保存后臺運行任務的標示符  
     UIBackgroundTaskIdentifier backgroundTask;  
}

</code> </pre>

  • <p>然后實現(xiàn)代碼 </p>
- (void)applicationDidEnterBackground:(UIApplication *)application {
    //通知系統(tǒng), 我們需要后臺繼續(xù)執(zhí)行一些邏輯
    backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
        //超過系統(tǒng)規(guī)定的后臺運行時間, 則暫停后臺邏輯
        [application endBackgroundTask:backgroundTask];
        backgroundTask = UIBackgroundTaskInvalid;
    }];
    //判斷如果申請失敗了, 返回
    if (backgroundTask == UIBackgroundTaskInvalid) {
        NSLog(@"beginground error");
        return;
    }
    //已經(jīng)成功向系統(tǒng)爭取了一些后臺運行時間, 實現(xiàn)一些邏輯, 如網(wǎng)絡處理
    //some code
}
  • <p> 處理完之后掛起線程 </p>
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;

4.無限后臺運行

首先聲明你需要的后臺任務
在Info.plist中添加UIBackgroundModes鍵值,它包含一個或多個string的值,包括:
  • audio:在后臺提供聲音播放功能,包括音頻流和播放視頻時的聲音
  • location:在后臺可以保持用戶的位置信息
  • voip:在后臺使用VOIP功能

<p>前面的每個value讓系統(tǒng)知道你的應用程序應該在適當?shù)臅r候被喚醒。例如,一個應用程序,開始播放音樂,然后移動到后臺仍然需要執(zhí)行時間,以填補音頻輸出緩沖區(qū)。添加audio鍵用來告訴系統(tǒng)框架,需要繼續(xù)播放音頻,并且可以在合適的時間間隔下回調應用程序;如果應用程序不包括此項,任何音頻播放在移到后臺后將停止運行。</p>

  • <p> 下面以后臺播放音樂為例:</p>

<p>在Supporting Files目錄下的【02 應用進入后臺繼續(xù)播放音樂-Info.plist】 增加一項【Required background modes】 值為【App plays audio or streams audio/video using AirPlay】<p>
iamge
// 后臺播放, 
AVAudioSession * session = [AVAudioSession sharedInstance];
// 類型是:播放和錄音
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
// 而且要激活 音頻會話
[session setActive:YES error:nil];

最后貼出官方文檔地址:

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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