iOS 7 的後台多任務 (multitasking) 對比之前有何不同,具體機制是什麼?會帶來什麼變化?

原話大意是說,iOS7會智能地記住用戶的使用習慣,從而提供多任務的機制。還提到了音樂播放器和來電打斷時,原先的iOS會如何處理,大意也就是新的iOS7會更強調類似的體驗。

iOS原先並不算是完全的多任務,甚至完全的墓碑機制都算不上,更注重前台服務質量。看過SDK或者其他文檔的朋友能否詳細解釋下並說下區別?

官方可見的介紹:

Keep the content of your app up-to-date by adopting the new multitasking APIs in iOS 7. The new services allow your app to update information and download content in the background without draining the battery unnecessarily. The updates can happen at opportunistic times and are intelligently scheduled according to usage, so your app can update content in the background just when your users need it.


看完文檔了,更新一下。

簡單來說,這玩意是對開發者友好,但對設備不友好的(可能會偷偷摸摸地佔用流量和電量)。

對用戶來說,如果你帶寬夠,對發熱不敏感的話,會得到更好的應用體驗。

從 iOS 4 開始,應用就可以在退到後台後,繼續運行一小段時間了(10 分鐘)。

此外還可以把自己聲明為需要在後台運行,就能不限時地運行了。不過限制為播放音樂、使用 GPS 等。值得一提的是,有的應用為了達到後台不限時運行的目的,在後台播放無聲的音樂(審核不一定會被發現)。

iOS 5 開始又多了一種類型:下載報刊雜誌。

然後 iOS 7 則可以下載各種玩意和定時抓取。

不過對於開發者來說,iOS 7 還有 2 個需要注意的區別:

  1. iOS 7 以前,應用進入後台繼續運行時,如果用戶鎖屏了,那麼 iOS 會等待應用運行完,才進入睡眠狀態。

    而在 iOS 7 上,系統會很快進入睡眠狀態,那些後台應用也就暫停了。如果收到事件被喚醒(例如定時事件、推送、位置更新等),後台應用才能繼續運行一會。

    因為處理過程變成了斷斷續續的,因此下載時也要使用 NSURLSession 來處理(即下文中的 Background Transfer Service)。
  2. 由於 App Switcher 的存在,應用即使在後台,用戶仍然能看到它在退出前的快照。如果有什麼不可見人的東西(例如剛拍的艷照啦,勁爆的聊天內容啦,銀行卡密碼什麼的),就處理下界面來隱藏吧。

順便再介紹下三個新東西:

  1. Background Fetch。可以設置應用在後台至少隔多久時間就去抓取一下更新(注意是至少,不保證達到這個頻率)。以微博來舉例,如果用戶的微博被別人評論了,iOS 7 之前得讓微博的伺服器來推送一條通知,用戶接收到後,進入該條微博,等待載入該評論;而 iOS 7 上則可以讓用戶每隔一定時間(如一分鐘)查詢一下有沒有更新,發現有則下載更新的內容,然後發送一條本地通知給用戶,用戶接收到後,進入該條微博,顯示在後台下載好的評論內容。如果需要的話,連 timeline 都能給你提前更新了。

    很顯然,這種做法體驗更好,但更費流量和電池。
  2. ??Silent Remote Notification。iOS 7 之前的推送會直接彈出一個對話框,用戶確認後才會進入應用;而 iOS 7 上則可以不彈出對話框,而是直接通知應用去下載更新,等下完後再發送本地通知給用戶,這樣用戶進入應用後,就能直接看到更新的內容了。

    這種做法就比前者好些,不需要在後台輪詢了。只是用戶如果對更新內容不感興趣,也會被強制下載。

    為了避免被濫用,這種推送有頻率限制(每小時幾次),所以推送 QQ、微信這類經常被刷屏的消息肯定沒戲。
  3. ??Background Transfer Service。iOS 7 之前的應用可以在後台繼續運行一段時間來下載,但如果因為各種原因而導致應用被退出了(被用戶殺掉,內存不足或超時被系統殺掉等),那麼下載是得不到保證的。iOS 7 的後台傳輸服務則可以讓系統去下載,出錯或下完後通知並喚醒應用來處理。

    對用戶來說的好處就是,想離線緩存影片時,可以讓優酷之類的應用在後台下載,自己放點音樂看看漫畫,而不用傻傻地開著優酷等待下完。上傳當然也是支持的,基友再也不用擔心你沒空發小電影什麼的了。此外,1 和 2 里提到的後台下載,也都會用到 3。

    為了避免浪費流量,該服務只會在 WiFi 環境下才進行傳輸。

需要特別注意的是:應用被以上三類喚醒時,只被給予幾秒鐘時間來處理更新。

要總結的話,我預測下一代 iPhone 待機時間會減少,實際可用時間減少,但官方標稱的使用時間不變。


iOS7可以通過伺服器端的Push喚醒客戶端在後台做動作(之前只有Newsstand類型可以),這樣用戶在切換到該應用時,界面反應會更及時(試想下你看到了微信的Push,但是打開微信還要『連接』一會兒,才能看到完整信息的痛苦);也能做一些定時類的後台任務(有些用戶希望新聞客戶端可以在早上8點鐘自動離線新聞),這之前都是技術實現不了的。


大致讀了@潘逸塵 提供的文檔,理解如下:

ios7提供多線程機制用於下載更新。除了自動後台更新每個應用程序的最新版本,還提供機制讓應用自動在後台下載新內容。

具體有兩種介面來喚醒應用的後台: 一種是定時喚醒,另一種是通過消息推送來喚醒。

所以,貌似僅僅是用於後台下載內容,不清楚能不能做別的事情,如何界定,如何審核。


Multitasking Enhancements

iOS 7 supports the following new background execution modes for apps:

Apps that regularly require new content can register with the system and be woken up or launched periodically to download that content in the background. To register, include the UIBackgroundModes key with the fetch value in your app』s Info.plist file and set the minimum time you want between fetch operations using the setMinimumBackgroundFetchInterval: method. You must also implement the application:performFetchWithCompletionHandler: method in your app delegate to perform any downloads.

Apps that use push notifications to notify the user that new content is available can now use those notifications to initiate background download operations. To support this mode, include the UIBackgroundModes key with the remote-notification value in your app』s Info.plist file. Your app delegate must also implement the application:didReceiveRemoteNotification:fetchCompletionHandler: method.

Apps supporting either the fetch or remote-notification background modes may be launched or moved from the suspended to background state at appropriate times. In the case of the fetch background mode, the system uses available information to determine the best time to launch or wake apps. For example, it does so when networking condition are good or when the device is already awake. Apps supporting the remote-notification background mode may be woken up when a new push notification arrives but before that notification is delivered to the user. The app can use the interval to download new content and have that content ready to present to the user when the notification is subsequently delivered.

To handle the downloading of content in the background, apps should use the new NSURLSession class. This class improves on the existing NSURLConnection class by providing a simple, task-based interface for initiating and processing NSURLRequest objects. A single NSURLSession object can initiate multiple download and upload tasks, and through its delegate can handle any authentication requests coming from the server.

For more information about the new background modes, see 「App States and Multitasking」 in iOS App Programming Guide .

以上來自官方技術文檔,我個人感覺說的還是蠻清楚的。


技術細節不懂,但是在使用感受上,iOS7的多任務機制明顯不如iOS6友好。當一個應用被切換到後台一次之後再切換回來,百分之九十竟然會重新進入應用啟動界面,連墓碑機制都算不上了。


其實我覺得不算剛性吧。至少我覺得很多人所認為必要的一個後台動作:「掛Q "是沒有意義的,掛微信也是沒有意義的,掛微博就更加。。所以原來墓碑式的話,任務都交給系統的推送就好了,不是很好么?

本來我就很受不了安卓的真後台,像我同學下了4個清內存的軟體,然後這四個肯定都會是常駐的,結果他的1000元安卓機更卡了。蘋果就從來不會,因為蘋果知道我們從來都不需要後台,我們需要的是比wp的推送更及時更靈通的推送。(並不是強調蘋果內存大,蘋果內存從來都是用到70-80%的,用什麼助手就能看到。)

對於多任務的看法我就只從很多人問的「蘋果有沒有的掛QQ」這個方向入手,其他方面完全沒有考慮,僅供參考。蘋果應該會堅持原來的做法,依然是墓碑吧。沒有詳細看二樓的英文,應該不會是常駐後台吧。quote:may be launched or moved from the suspended to background state at appropriate times。

使用習慣?multitasking?sabaliwagalinayi


http://club.tgfcer.com/thread-6721943-1-1.html


推薦閱讀:

iOS開發質量的那些事
iOS 的融合與 AR 的崛起
[貝聊科技]AsyncDisplayKit近一年的使用體會及疑難點
破一下 Apple 與 PRC 領土有關的兩條謠言
你對 OS X 10.11 / iOS 9 的預設中文介面顯示字體有哪些期待?

TAG:iOS | iOS開發 | iOS7 | iOSAPIs |