ios后臺(tái)網(wǎng)絡(luò)任務(wù)NSURLSession介紹

ios后臺(tái)任務(wù)

ios里,基于設(shè)備續(xù)航和安全方面的考慮猴蹂,不在前臺(tái)運(yùn)行的app會(huì)被系統(tǒng)掛起,所有線程進(jìn)入沉睡態(tài)楣嘁,Ios4之前磅轻,這個(gè)時(shí)機(jī)基本是即時(shí),只要app一進(jìn)入后臺(tái)逐虚,程序馬上就會(huì)被掛起聋溜。ios4后,允許app在后臺(tái)運(yùn)行任務(wù)叭爱,不過(guò)需要注冊(cè)撮躁,而且有各種限制。ios7后买雾,可以在后臺(tái)運(yùn)行的任務(wù)種類(lèi)增加了很多把曼,
大概羅列一下后臺(tái)運(yùn)行的任務(wù)類(lèi)型:

  • 通用類(lèi)型任務(wù)
    app注冊(cè)后,在退后臺(tái)后有一定的時(shí)間運(yùn)行任務(wù)漓穿,時(shí)間到后app被掛起
  • 后臺(tái)播放音樂(lè)
  • 位置服務(wù)
  • IP電話(VoIP)
  • Newsstand

ios7后新增

  • 數(shù)據(jù)獲揉途(Background Fetch)
  • 推送喚醒(靜默推送,Silent Remote Notifications)
  • 后臺(tái)傳輸(Background Transfer Service)

感興趣的同學(xué)可以查看官方文檔或者參考一下文章https://onevcat.com/2013/08/ios7-background-multitask/

因?yàn)樽罱龅絘pp退到后臺(tái)導(dǎo)致上傳超時(shí)失敗的問(wèn)題器净,所以專(zhuān)門(mén)研究了“后臺(tái)傳輸”這個(gè)后臺(tái)任務(wù)的特性和使用方式型雳。

NSURLSession

如果app退到后臺(tái)后,有數(shù)據(jù)在傳輸,這時(shí)候是在當(dāng)前的app進(jìn)程內(nèi)進(jìn)行的纠俭,如果app被掛起沿量,那么線程也就會(huì)被掛起。而IOS7后冤荆,推出了NSURLSession這個(gè)類(lèi)朴则,按照官方說(shuō)明,這個(gè)類(lèi)的行為是由系統(tǒng)托管的钓简,運(yùn)行在另外的進(jìn)程乌妒,不受app生命周期的影響。那就是說(shuō)外邓,即使app被掛起甚至是殺掉撤蚊,系統(tǒng)都可以幫你完成數(shù)據(jù)傳輸。
一旦數(shù)據(jù)傳輸完成:

  1. 如果app在前臺(tái)损话,那么Task和Session相關(guān)的delegate會(huì)被調(diào)用
  2. 如果app被掛起侦啸,那么系統(tǒng)先喚醒a(bǔ)pp,然后app的-application:handleEventsForBackgroundURLSession:completionHandler:方法被調(diào)用
  3. 如果app已經(jīng)被殺死丧枪,從實(shí)際測(cè)試結(jié)果來(lái)看光涂,什么都不會(huì)發(fā)生,只有啟動(dòng)app的時(shí)候拧烦,上面第二種情況的回調(diào)會(huì)被調(diào)用

限制

  • 后臺(tái)傳輸只會(huì)通過(guò)wifi來(lái)進(jìn)行
  • 數(shù)據(jù)傳輸是離散式或者說(shuō)是碎片式的忘闻,因?yàn)橄到y(tǒng)可能也在運(yùn)行其他的app或者任務(wù),所以數(shù)據(jù)傳輸?shù)臅r(shí)間是不可控的恋博,所以代碼里的超時(shí)邏輯有影響
  • 如果是數(shù)據(jù)下載任務(wù)齐佳,文件是存儲(chǔ)在系統(tǒng)提供的臨時(shí)目錄下的,而不是app的沙箱交播,記得要在任務(wù)完成后轉(zhuǎn)移文件

使用方式

  1. 創(chuàng)建session
- (NSURLSession *)backgroundSession
{
    //Use dispatch_once_t to create only one background session. If you want more than one session, do with different identifier
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.yourcompany.appId.BackgroundSession"];
        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    });
    return session;
}

2 創(chuàng)建任務(wù)并啟動(dòng)

- (void) beginDownload
{
    NSURL *downloadURL = [NSURL URLWithString:DownloadURLString];
    NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];
    self.session = [self backgroundSession];
    self.downloadTask = [self.session downloadTaskWithRequest:request];
    [self.downloadTask resume];
}

3 實(shí)現(xiàn)delegate
AppDelegate

//AppDelegate.m
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
  completionHandler:(void (^)())completionHandler
{
    //Check if all transfers are done, and update UI
    //Then tell system background transfer over, so it can take new snapshot to show in App Switcher
    completionHandler();
    
    //You can also pop up a local notification to remind the user
    //...
}

Seesion相關(guān)的delegate重虑,這個(gè)函數(shù)在任務(wù)成功或者失敗的時(shí)候被調(diào)用


- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                           didCompleteWithError:(NSError *)error;

Task相關(guān)的delegate,Task有多種秦士,比如上傳任務(wù),下載任務(wù)等永高,不同任務(wù)的回調(diào)會(huì)不同隧土,比如下載任務(wù),能獲得當(dāng)前下載的字節(jié)數(shù)等等


- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                              didFinishDownloadingToURL:(NSURL *)location;

小結(jié)

URLSession適用于大量數(shù)據(jù)在后臺(tái)傳輸?shù)膱?chǎng)景(小數(shù)據(jù)在app被掛起前應(yīng)該能結(jié)束傳輸)命爬,不過(guò)使用中有諸多限制曹傀,對(duì)代碼模塊的設(shè)計(jì)沖擊也比較大,需謹(jǐn)慎使用饲宛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皆愉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幕庐,老刑警劉巖久锥,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異异剥,居然都是意外死亡瑟由,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)冤寿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)歹苦,“玉大人,你說(shuō)我怎么就攤上這事督怜∨故荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵号杠,是天一觀的道長(zhǎng)蚪腋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)究流,這世上最難降的妖魔是什么辣吃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮芬探,結(jié)果婚禮上神得,老公的妹妹穿的比我還像新娘。我一直安慰自己偷仿,他們只是感情好哩簿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酝静,像睡著了一般节榜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上别智,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天宗苍,我揣著相機(jī)與錄音,去河邊找鬼薄榛。 笑死讳窟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敞恋。 我是一名探鬼主播丽啡,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼硬猫!你這毒婦竟也來(lái)了补箍?” 一聲冷哼從身側(cè)響起改执,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坑雅,沒(méi)想到半個(gè)月后辈挂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霞丧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年呢岗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹尝。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡后豫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突那,到底是詐尸還是另有隱情挫酿,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布愕难,位于F島的核電站早龟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猫缭。R本人自食惡果不足惜葱弟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猜丹。 院中可真熱鬧芝加,春花似錦、人聲如沸射窒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脉顿。三九已至蝌麸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艾疟,已是汗流浹背来吩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔽莱,地道東北人误褪。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碾褂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子历葛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,321評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 自從古老的iOS4以來(lái),當(dāng)用戶點(diǎn)擊home建的時(shí)候,你可以使你的APP們?cè)趦?nèi)存中處于suspended(掛起)狀態(tài)...
    木易林1閱讀 3,044評(píng)論 1 4
  • 一正塌、前言 NSURLSession是iOS7以后提出的網(wǎng)絡(luò)請(qǐng)求API嘀略,這個(gè)API通過(guò)一系列的代理方法支持認(rèn)證,讓你...
    nuclear閱讀 11,150評(píng)論 3 18
  • 今天上午老師講了文件的保存和讀取乓诽,就是把上節(jié)課練習(xí)的程序進(jìn)行完善帜羊,使它可以把輸入的信息保存到一個(gè)文件里,然后再次打...
    34d71ddb735c閱讀 169評(píng)論 0 0