關於iOS后台問題( 一 )(ios后台刷新,后台定位,后台下載,真后台)


關於iOS的后台,以下引用一些文段進行一下腦補,請同學們大致看一下,有個基礎,原文出處

-----------------------------------------------------------------------------------------------

OS 7中,實際上APP擁有四種后台模式,無論是哪一種后台機制,均需要利用蘋果給予的相應后台接口實現。IOS7系統中,開發者可以靈活利用多種后台接口(API)實現更加智能的應用操作。
一,無后台僅推送
第 一種后台方式為傳統的無后台操作,僅有蘋果推送機制,這種方式出現在iOS 3.x以下的大部分系統版本上。這個方式下,應用在按下Home鍵后即會關閉退出,其數據通過蘋果搭建的推送服務器傳輸,並不需要應用后台運行。這種方式 不太好的原因在於,每次推出后,重新進入均需要重新加載,雖然推送能夠統一解決數據和信息的傳輸,但遇到需要頻繁進入應用(如聊天APP)的時候便會顯得 體驗不好。
二,墓碑式
第二種方式為墓碑式的后台機制,這在iOS 4后被大量采用,也就是人們所說的偽多任務。這方式相比較第一種改進的地方在於,按下Home鍵至主界面后,應用隨即進入后台,但其被凍結,並不能進行任何操作。
三,智能調度后台
第三種為系統智能調度的后台,iOS 7新增的background fetch, 這個后台接口在蘋果WWDC 2013上有提及,其會根據用戶行為自動調整達到效率最優的后台模式,能夠處理不是很有時效性的信息獲取。例如一些社交、新聞類的應用的后台信息更 新,iOS系統便會根據應用啟動頻率、時間和當前網絡和電量的狀況來智能分配每個應用的后台獲取頻率和啟動時長。
由於擁有該接口的應用的數據后台 刷新操作是統一調度的,因此系統可以在一個進程里面獲得多個應用的數據,類似統一的推送機制,這樣就能夠最大限度地省電。 不過這個方式也有一個缺點,那便是開發者不能設定數據具體什么時候更新,因此這個后台方式只能應用在一些時效性和敏感度不高的地方。
四,真后台
 第四種方式便是真后台機制,但iOS的真后台與Android的后台機制是不一樣的,為了兼顧系統體驗和統一進程管理,iOS在這上面加入了眾多的限制。大致擁有以下幾個后台接口模式:
1、Background Audio,這是后台的音頻,這個很早之前便有,也是iOS設備中用得最多的后台應用,調用這個接口可以實現后台的音樂播放。
2、Location Services,這是后台的定位,系統會擁有統一頁面進行管理。
3、VoIP,后台語音服務,類似Skype通話應用需要調用,可進行后台的語音通話。
4、Newsstand,報刊雜志后台自動下載更新,其能夠自動實時更新。
5、 Background Task  Completion,這個接口早在iOS 4時候便擁有,其可以供任意類型的APP使用,不過在舊系統中,這個接口的后台限制運行時間僅為10分鍾,意味着當應用退至后台,其后台運行僅能持續10 分鍾便會轉至休眠狀態。iOS 7中對這個接口作出了改變,原來的為連續10分鍾,即不論你這10分鍾內用戶是否關閉屏幕進入休眠狀態,應用仍然會在后台等待10分鍾完結后推出,而新的 改進為假如遇到關閉屏幕休眠的情況,這后台運行的10分鍾便會跟隨一同休眠,剩余的后台時間將會留待用戶再一次喚醒設備才計算。這樣后台運行的時間仍然為 10分鍾,但並不連續,這樣做的優點為省電。
如現在有一些詞典應用帶有后台復制選詞功能,實際上其是利用了這個接口,如果用戶開啟詞典后並推出,即使屏幕關閉,但詞典仍然在后台運行,電量消耗還是比較大的,在iOS 7上,這個問題可以得到解決。
6、 Remote Notification,這是本次較大的一個改進接口,以往聊天類應用接受推送后點進去需要再收一次信息,這情況在QQ、微信等應用上最為明顯。不過擁 有了這個接口后,這情況將不復存在,以后推送將能夠直接啟動后台任務。值得注意的是remote notification支持silent notification(靜默推送),這樣dropbox這類同步應用可以在后台以最節能的模式實時靜默同步了,類似布卡漫畫這種也可以推送正在追的漫 畫的新章節並在后台靜默下載,待到下載好再給用戶發送一個本地推送,用戶點開即看無需再聯網
7、Background Transfer Service,后台上傳下載。iOS最接近傳統多任務的后台接口,可供任意類型的app調用,無時間限制。應用場景包括后台上傳和下載數據,這使得游戲 后台更新數據包,后台上傳視頻等等都成為可能,但是正如其名字,它只能用於處理上傳下載這種傳輸類的任務,類似后台剪切板監控這種它就無能為力了。

 

 

--------------------------------------------------------------------------------------------------------------------------------

以下介紹一下實際操作

首先我們在工程中選擇Gapability,找到back ground mode,如圖

我們拿location updates刷新來舉例

當我們初始化CLLocationmanager之后,需要額外添加這樣一句代碼

self.manger.pausesLocationUpdatesAutomatically = NO; //該模式是抵抗ios在后台殺死程序設置,iOS會根據當前手機使用狀況會自動關閉某些應用程序的后台刷新,該語句申明不能夠被暫停,但是不一定iOS系統在性能不佳的情況下強制結束應用刷新

 

經過測試,CLLocationmanager協議方法能在后台一直被調用,此時App是比較耗電的,如果后台擁有其他處理和運算的需求,最好將位置更新觸發的操作進行多線程處理,最好是多線程排隊處理。還有一種方法就是在AppDelegate中的生命周期函數里,在即將進入后台的時候將CLLocationmanager的閥值降低,比方說原來監測的米級別,可以降低成千米級別

 

在 applicationDidEnterBackground 中加入

 

if ([CLLocationManager significantLocationChangeMonitoringAvailable]) 

        {

        
            [[mapCenter manager] stopUpdatingLocation];

            [[mapCenter manage ] startMonitoringSignificantLocationChanges];

        }

        else 

        {

            NSLog(@"Significant location change monitoring is not available.");

        }

 


 

在applicationDidBecomeActive 中加入 

     if ([CLLocationManager significantLocationChangeMonitoringAvailable]) 

    {



[[mapCenter manager] stopMonitoringSignificantLocationChanges];

[[mapCenter manager] startUpdatingLocation];

}

else 

    {

NSLog(@"Significant location change monitoring is not available.");

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM