如何在 iOS7 實現(xiàn)后臺獲取數(shù)據(jù)

寫于2013-11-26

從 iOS 7 開始,程序就可以在退到后臺時干一些事情了,包括獲取用戶位置仅孩、獲取網(wǎng)絡數(shù)據(jù)等,本文將介紹如何在后臺獲取網(wǎng)絡數(shù)據(jù)印蓖。

實現(xiàn)

要使用后臺獲取網(wǎng)絡數(shù)據(jù)的功能只需要在 Xcode5 中的項目設置切到 Capabilities 勾選 Background Modes 中的 Background fetch 即可辽慕,如圖

或者直接在 info.plist 文件中添加 key UIBackgroundModes 并選擇 background fetch 。

首先設置后臺獲取的時間間隔:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

UIApplicationBackgroundFetchIntervalMinimum 表示最小的時間間隔赦肃,而 UIApplicationBackgroundFetchIntervalNever 就表示停止后臺獲取了溅蛉。你也可以設置你自己想要的時間間隔,比如天氣類的軟件就可以設置成1小時即3600秒摆尝。要說明的是温艇,這個時間間隔并不是絕對的,是否調(diào)用獲取函數(shù)完全是系統(tǒng)說了算堕汞,你設置的時間只是最小時間勺爱,比如你設置成1小時并不是每小時都會調(diào)用獲取函數(shù),當系統(tǒng)高興時每次調(diào)用的時間間隔不會小于1小時讯检,如果系統(tǒng)不高興了可能1天都不會調(diào)用一次琐鲁。

那么在哪里獲取網(wǎng)絡數(shù)據(jù)呢?你需要在 app delegate 文件中添加如下代碼:

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
    __block UIBackgroundFetchResult result = UIBackgroundFetchResultFailed;
    [[AFHTTPSessionManager manager] GET:url
                             parameters:parameters
                                success:^(NSURLSessionDataTask *task, id responseObject) {
                                    if (responseObject) 
                                        result = UIBackgroundFetchResultNewData;
                                    else
                                        result = UIBackgroundFetchResultNoData;
                                    
                                    completionHandler(result);
                                }
                                failure:^(NSURLSessionDataTask *task, NSError *error) {
                                    result = UIBackgroundFetchResultFailed;
                                    completionHandler(result);
                                }];
}

上面的代碼是使用 AFNetworking 在后臺獲取網(wǎng)絡數(shù)據(jù)的基本邏輯人灼。其中需要注意的是 completionHandler 函數(shù)围段,不管獲取數(shù)據(jù)成功還是失敗,一定要在最后調(diào)用該函數(shù)并傳入相應的 UIBackgroundFetchResult 投放。

為什么一定要調(diào)用 completionHandler 呢奈泪?首先,系統(tǒng)根據(jù) result 的值來判斷你的程序在后臺程序里的優(yōu)先級和后臺調(diào)用行為灸芳,如果你不調(diào)用該函數(shù)涝桅,在一段時間之后系統(tǒng)將不再激活你的程序去后臺獲取了。其次烙样,系統(tǒng)會在調(diào)用 completionHandler 時截取你的應用更新數(shù)據(jù)后的新UI截圖冯遂,并用于后臺切換的示意圖(即雙擊home鍵實現(xiàn)的應用圖片)

測試

運行程序后,如圖點擊 Debug 菜單中的 Simulate Background Fetch 即可谒获。

另一種方法稍微復雜一點蛤肌,修改 Scheme 或新建一個 Scheme 壁却,在 Scheme 設置的 Options 標簽下選中 Background Fetch ,如圖:

由于后臺獲取的不確定性裸准,想實機測試的話比較困難展东,可以將獲取間隔設置成 UIApplicationBackgroundFetchIntervalMinimum ,同時關掉系統(tǒng)所有其他后臺程序(雙擊home鍵并滑出)炒俱,然后鎖屏并等待5分鐘以上琅锻,在解鎖機器后調(diào)用后臺獲取的概率比較大。

注意

  • 后臺獲取并不是無限制的向胡,系統(tǒng)在激活你的應用之后會給大概30秒的時間用于處理網(wǎng)絡數(shù)據(jù),所以應該盡量減少數(shù)據(jù)獲取量并避免更新UI惊完,更好的方式是在后臺獲取少量數(shù)據(jù)并存儲然后在下次進入應用時再更新必要的UI變化
  • 后臺調(diào)用具有不確定性僵芹,所以不要用于需要準確性的功能,比如定時提醒
  • 在不需要后臺獲取時將獲取間隔設為 UIApplicationBackgroundFetchIntervalNever 小槐,避免不必要的消耗
  • 不要一味的將獲取間隔設為最小值拇派,根據(jù)你的應用的需求來設置,比如只會每天變化的數(shù)據(jù)就應該設置成24*3600秒
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凿跳,一起剝皮案震驚了整個濱河市件豌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌控嗜,老刑警劉巖茧彤,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疆栏,居然都是意外死亡曾掂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門壁顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珠洗,“玉大人,你說我怎么就攤上這事若专⌒肀停” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵调衰,是天一觀的道長膊爪。 經(jīng)常有香客問我,道長窖式,這世上最難降的妖魔是什么蚁飒? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮萝喘,結(jié)果婚禮上淮逻,老公的妹妹穿的比我還像新娘琼懊。我一直安慰自己,他們只是感情好爬早,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布哼丈。 她就那樣靜靜地躺著,像睡著了一般筛严。 火紅的嫁衣襯著肌膚如雪醉旦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天桨啃,我揣著相機與錄音车胡,去河邊找鬼。 笑死照瘾,一個胖子當著我的面吹牛匈棘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播析命,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼主卫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹃愤?” 一聲冷哼從身側(cè)響起簇搅,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎软吐,沒想到半個月后瘩将,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡关噪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年鸟蟹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片使兔。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡建钥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虐沥,到底是詐尸還是另有隱情熊经,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布欲险,位于F島的核電站镐依,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏天试。R本人自食惡果不足惜槐壳,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喜每。 院中可真熱鬧务唐,春花似錦雳攘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刑巧,卻和暖如春喧兄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啊楚。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工吠冤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恭理。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓咨演,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚯斯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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