iOS7 多任務(wù)管理

本文主要是看了WWDC 2013 - Session 204 - What's New with Multitasking 做出的翻譯和總結(jié), 文字/視頻鏈接如下

文字鏈接 : 文字
視頻鏈接 : 視頻


該session主要講的是iOS7比iOS6在多任務(wù)管理上新增了這些API.

  • 后臺應(yīng)用刷新
  • 遠程推送
  • 后臺傳輸服務(wù)

iOS6的時候, 盡管你鎖屏了, 一些程序的后臺任務(wù)也會繼續(xù)運行直到完成.

iOS7的時候做了改進, 鎖屏之后手機很快就會進入睡眠狀態(tài), 任務(wù)就會被掛起 但是, 當手機被喚醒了, 例如在看郵件的時候, 你的應(yīng)用程序就能利用這些時間片去繼續(xù)執(zhí)行后臺任務(wù).

iOS7之后, 建議使用NSURLSession.

應(yīng)用程序進入后臺后仍然有幾分鐘的時間可以處理任務(wù), 但是這幾分鐘不保證是連續(xù)的. 也就是說有可能會被強行中斷, 例如內(nèi)存不足的時候系統(tǒng)會殺死后臺應(yīng)用程序.

新概念 :
App Switcher, app在進入后臺之前系統(tǒng)會先拍個快照, 這樣你在切換應(yīng)用程序的界面就會看到退出時的app的界面. 這種行為為 : State Restoration

App Switcher

需要注意的是 : 在App Switch劃走app在iOS6的時候只會停止app runnning(仍處于Background狀態(tài)), 而在iOS7則還會停止app running in the background. 所以現(xiàn)在一些使用到GPS或者實時位置更新的app在被劃走之后這些功能就會停止運行, 你不會在后臺收到任何通知.

首先, iOS7新增的多任務(wù)處理的API分為三大種

  1. Background Fetch : 后臺獲取, 供進入后臺的app的能周期性地更新他的內(nèi)容.

  2. Remote Notification : 遠程通知, 當你發(fā)送一個很重要的通知時, 他能夠從后臺喚醒你的app. 例如即時通訊的消息等

  3. Background Transfer Service : 后臺傳輸服務(wù), 他允許在用戶離開你的app后(回到桌面)通過自啟動在后臺隊列中執(zhí)行上傳和下載任務(wù).

后臺應(yīng)用刷新


后臺應(yīng)用刷新能保證每當你的app進入onFocus狀態(tài)的時候用戶看到的都是最新的內(nèi)容, 而不是他們之前退出時(舊)的內(nèi)容.

使用用法 :

  • 在info.plist中把Background Fetch這個key添加到UI background modes中.

  • 設(shè)置后臺獲取的minimum fetch interval, 最小時間間隔

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    {
    
      /*
       * 默認是UIApplicationBackgroundFetchIntervalNever.
       */
      [application setMinimumBackgroundFetchInterval:3600];
    
      return YES;
    }
    
  • 當時間到了的時候, 你的應(yīng)用程序?qū)?launch/resume)調(diào)用以下方法. 你唯一需要做的就是實現(xiàn)這個方法, 發(fā)送網(wǎng)絡(luò)請求, 接收響應(yīng)數(shù)據(jù)并刷新UI.

    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
          // go to fetch your new content here    
          // go to update UI here
          // 做完所有處理后一定要調(diào)用completionHandler block 告訴系統(tǒng)
    }
    

最小時間間隔

需要注意的是, 當你的應(yīng)用是剛下載好的, 用戶還沒登陸時, 這個值應(yīng)為never. 當用戶登陸之后, 這個值可以告訴系統(tǒng), 讓系統(tǒng)在適當?shù)臅r間間隔下啟動你的應(yīng)用并發(fā)起網(wǎng)絡(luò)請求并更新UI(例如更新用戶狀態(tài)信息等). 當然, 如果用戶退出登陸了, 你應(yīng)該設(shè)置這個值為never.

例如你設(shè)置了5秒鐘, 則代表app在退出到后臺運行的5秒鐘以內(nèi)是不會調(diào)用該API的, 只有在5秒鐘之后才有可能去獲取數(shù)據(jù). 也就是說, 應(yīng)用在進入后臺后的interval這個時間段內(nèi)是不會被喚醒的.

問題來了, 這有什么用? 我肯定希望我的app任何時候都能自動更新然后每次用戶進入我app的時候顯示的都是最新的內(nèi)容啊! 這么想就太自私了, 因為用戶手機有電量, 流量等等各種限制. 例如, 抓取某幾個地區(qū)的天氣數(shù)據(jù), 這是個很耗流量, 電量且耗服務(wù)器資源的操作, 此時你不會想每隔1分鐘他就發(fā)起一個網(wǎng)絡(luò)請求吧? 你會傾向于1個小時或者更長的時間去請求, 這能節(jié)省資源, 提高用戶體驗.

需要注意的是, 不應(yīng)該把delegate方法中的completionHandler當做property存儲起來再調(diào)用, 而是應(yīng)該通過方法傳遞待完成后直接調(diào)用. 因為當后臺刷新同時出現(xiàn)兩次的時候, 第二次的block就會把第一次的block給覆蓋掉(假如是用property存儲的話), 那意味著第一次的block永遠無法被調(diào)用. 切記!

當iOS系統(tǒng)中同一時間有多個后臺獲取任務(wù)的時候, 系統(tǒng)就能在一個時間段內(nèi)處理這些任務(wù), 而不是零零散散地處理, 那會加大電池損耗. 但是一個時間段內(nèi)的任務(wù)太多了也是會增大電量的損耗的.

更為牛逼的是, iOS系統(tǒng)做了如此的優(yōu)化. 他用一個observer觀察用戶真實的使用習慣, 例如我每天早上7點鐘打開簡書看文章, 每天中午12點打開簡書, 每天晚上10點打開簡書. 那么系統(tǒng)就會記錄起這個模式. 之后就會盡可能在我打開app之前就做好這個后臺應(yīng)用刷新的工作.

optimize

如果我們不需要后臺應(yīng)用刷新的服務(wù), 可以自行在設(shè)置 -> 通用 -> 后臺應(yīng)用刷新里關(guān)掉這個功能. 畢竟有時候我們真的電量不足了, 或是流量不夠用了...

遠程通知


當我發(fā)一個消息給我朋友的時候, 實際上是我先發(fā)給蘋果的服務(wù)器, 然后蘋果服務(wù)器再下發(fā)給我朋友的設(shè)備, 然后他才接收到消息/彈窗.

另外, 還能發(fā)一個Silent Notification(不帶消息的通知), 他會在后臺交付然后launch/resume你的app, 并執(zhí)行一些你自定義的任務(wù).

Silent Notification配置在這里

使用方法 :

  • 在info.plist中把remote-notification這個key添加到UI background modes中.

  • 當你發(fā)送一個遠程通知之后, app就會被launch/resume

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
      // do something here
      // remember call completionHandler block when finished work
    }
    

然而, 通知發(fā)得太頻繁的話, 你的設(shè)備和蘋果的服務(wù)器會限制你的發(fā)送頻率. 蘋果的服務(wù)器會先把你的一些通知先存儲起來, 過一會再推送給用戶.

后臺刷新和遠程推送的區(qū)別

后臺刷新 遠程推送
內(nèi)容重要性 有意思但是不太重要 需要立馬讓用戶知道的
頻率 非常頻繁 偶爾
例子 新聞, 社交, 圖片分享 即時信息, 同步內(nèi)容, 稍后閱讀

后臺傳輸服務(wù)


iOS7后支持后臺上傳/下載. iOS會把你的上傳/下載任務(wù)放在后臺傳輸服務(wù)隊列中, 當然與此同時你的app將會被喚醒, 以便處理任務(wù)執(zhí)行過程中的任何突發(fā)事件, 并保證用戶能第一時間知道這些情況.

使用的是NSURLSession而不是NSURLConnection. 他可以用NSURLSessionConfiguration來自定義該session的策略, 例如是否需要緩存, 超時等等. 顯然, 他也會launch/resume你的app.

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler
{
  // do something here
  // remember call completionHandler block when finished work
}

由于后臺傳輸服務(wù)是多應(yīng)用并行的, 所以你要用盡可能少的時間去做UI更新操作(少于一分鐘), 同時也要保證CPU使用率不要太高. 用instrument中的Time Profile查看執(zhí)行時間, 優(yōu)化讓CPU執(zhí)行時間盡可能少.

一般來說人們會使用這個后臺任務(wù)API來關(guān)閉數(shù)據(jù)庫連接操作或者關(guān)閉句柄或者其他系統(tǒng)資源.

數(shù)據(jù)保護

NSFileProtection

  • completeProtection表示沒鎖屏的時候數(shù)據(jù)可正常訪問, 鎖屏以后數(shù)據(jù)全部不能訪問.
  • None表示有沒有鎖屏都能正常訪問.

在database, SQLite database方面我們一定要用completeProtection以保證安全.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敞斋,一起剝皮案震驚了整個濱河市午衰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌红碑,老刑警劉巖糯钙,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罗心,死亡現(xiàn)場離奇詭異拄踪,居然都是意外死亡吏砂,警方通過查閱死者的電腦和手機撵儿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐血,“玉大人淀歇,你說我怎么就攤上這事⌒僦” “怎么了浪默?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵牡直,是天一觀的道長。 經(jīng)常有香客問我纳决,道長碰逸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任阔加,我火速辦了婚禮饵史,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胜榔。我一直安慰自己胳喷,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布夭织。 她就那樣靜靜地躺著吭露,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尊惰。 梳的紋絲不亂的頭發(fā)上讲竿,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音择浊,去河邊找鬼戴卜。 笑死,一個胖子當著我的面吹牛琢岩,可吹牛的內(nèi)容都是我干的投剥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼担孔,長吁一口氣:“原來是場噩夢啊……” “哼江锨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糕篇,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤啄育,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拌消,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挑豌,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年墩崩,在試婚紗的時候發(fā)現(xiàn)自己被綠了氓英。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹦筹,死狀恐怖铝阐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铐拐,我是刑警寧澤徘键,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布练对,位于F島的核電站,受9級特大地震影響吹害,放射性物質(zhì)發(fā)生泄漏螟凭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一赠制、第九天 我趴在偏房一處隱蔽的房頂上張望赂摆。 院中可真熱鬧,春花似錦钟些、人聲如沸烟号。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汪拥。三九已至,卻和暖如春篙耗,著一層夾襖步出監(jiān)牢的瞬間迫筑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工宗弯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脯燃,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓蒙保,卻偏偏與公主長得像辕棚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邓厕,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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