Snip20151216_3.png
NSURLSession使用注意事項(xiàng)
-
NSURLSession
- 所謂
網(wǎng)絡(luò)會話
,就是一段同服務(wù)器之間的通訊
唉地。一個session
可以由數(shù)個數(shù)據(jù)傳輸任務(wù)
構(gòu)成。 - session類型由
NSURLSessionConfiguration
對象決定:-
Default Session / 默認(rèn)會話
- 功能類似于
NSURLConnection
钞艇。 - 磁盤緩存譬猫。
- 用
keychain
保存證書。
- 功能類似于
-
Ephemeral Session / 臨時會話
- 內(nèi)存緩存值桩。
- 不保存證書摆霉。
-
invalidate
后,所有信息會被抹去
。
-
Background Session / 后臺會話
- app退出后携栋,
數(shù)據(jù)傳輸任務(wù)
被移動至一個獨(dú)立的進(jìn)程中繼續(xù)執(zhí)行
搭盾。 - 任務(wù)在后臺執(zhí)行時,遇到錯誤會
自動重試
婉支。 - 除了某些限制之外鸯隅,其它同特性
默認(rèn)會話
相似。
- app退出后携栋,
-
- 所謂
-
NSURLSessionTask
- 會話期間所執(zhí)行的
數(shù)據(jù)傳輸任務(wù)
向挖。 - task類型(所有的task都通過
NSURLSession
創(chuàng)建)-
NSURLSessionDataTask / 數(shù)據(jù)任務(wù)
- 以
NSData
的形式接收服務(wù)器返回的數(shù)據(jù)
蝌以。 -
分段監(jiān)測
數(shù)據(jù)。 - 適用于
頻繁的短小通訊
何之。
- 以
-
NSURLSessionDownloadTask / 下載任務(wù)
- 以
文件
的形式接收服務(wù)器返回的數(shù)據(jù)跟畅。 - 解決了大文件下載的
內(nèi)存管理
問題。 - 能夠
斷點(diǎn)續(xù)傳
:- 其
cancelByProducingResumeData:
會生成一個XML
數(shù)據(jù)溶推,保存了續(xù)傳所需的信息
徊件。 - 利用這個數(shù)據(jù)重新創(chuàng)建
download task
,以繼續(xù)下載蒜危。 - 只有通過
GET
方法獲取的文件才可以斷點(diǎn)續(xù)傳虱痕。
- 其
- 支持
后臺下載
。
- 以
-
NSURLSessionUploadTask / 上傳任務(wù)
- 向服務(wù)器發(fā)送
文件數(shù)據(jù)
舰褪。 - 支持
后臺上傳
。 - 一般不使用疏橄,原因如下:
-
不能
自動封裝請求體占拍,即仍然需要手動創(chuàng)建Request body
。 - 如果上傳的是
NSData
數(shù)據(jù)捎迫,可以使用POST
方法晃酒;但對于磁盤文件
,只能使用PUT
方法窄绒,現(xiàn)在基本沒有服務(wù)器支持這一方法贝次。
-
- 向服務(wù)器發(fā)送
-
- 會話期間所執(zhí)行的
-
后臺任務(wù)
- session必須通過
backgroundSessionConfigurationWithIdentifier:
創(chuàng)建。 - 在一個
獨(dú)立進(jìn)程
中執(zhí)行彰导。 - 必須使用
delegate
實(shí)現(xiàn)回調(diào)蛔翅。 - 只支持
HTTP/HTTPs協(xié)議
。 - 自動接受
Redirection
位谋。 - 上傳任務(wù)必須
從文件上傳
山析。 - 如果任務(wù)開始時
app處于后臺
,那么configuration
對象的discretinary
屬性被設(shè)置為YES掏父。
- session必須通過
/*
后臺任務(wù)執(zhí)行流程
*/
(app已退出)后臺任務(wù)進(jìn)行中--->
==================================
情況A:任務(wù)完成 / 需要驗(yàn)證證書--->
1. app代理方法application:handleEventsForBackgroundURLSession:completionHandler:被調(diào)用
2. 在其中所需執(zhí)行的操作:
- 保存completionHandler
- 根據(jù)identifier創(chuàng)建一個background configuration
- 創(chuàng)建background session
--->
3. 后臺任務(wù)被自動納入新建session--->
4. 所有任務(wù)完成笋轨,session代理方法URLSessionDidFinishEventsForBackgroundURLSession:被調(diào)用--->
5. 執(zhí)行之前保存的completionHandler(注意,其屬于UIKit,必須在主線程上執(zhí)行)
==================================
情況B:用戶再次啟動app--->
1. 在app代理方法application:didFinishLaunchingWithOptions:中根據(jù)identifier爵政,創(chuàng)建仍有未完成任務(wù)的session對象(一個或多個)
--->
2. 后臺任務(wù)被自動納入新建session--->
- 示例代碼
/*
Session代理方法
*/
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
{
NSLog(@"所有后臺任務(wù)已經(jīng)完成");
if (session.configuration.identifier) {
// 執(zhí)行實(shí)現(xiàn)保存的后臺session回調(diào)
self.backgrondSessionCompletionHandler();
}
}
======================================
/*
app代理方法
*/
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler
{
// 創(chuàng)建配置對象
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
// 根據(jù)配置對象創(chuàng)建session
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self.sessionDelegate delegateQueue:[NSOperationQueue new]];
NSLog(@"session被重新創(chuàng)建");
// 保存completionHandler
self.backgrondSessionCompletionHandler = completionHandler;
}
-
SSL / TLS 驗(yàn)證
-
Session-Level Challenges / 會話級別驗(yàn)證
仅讽,首先嘗試調(diào)用session代理方法URLSession:didReceiveChallenge:completionHandler:
。其次嘗試調(diào)用task打理方法URLSession:task:didReceiveChallenge:completionHandler:
钾挟。 -
Non-Session-Level Challenges / 非會話級別驗(yàn)證
洁灵,只調(diào)用task代理方法URLSession:task:didReceiveChallenge:completionHandler:
。
-
-
注意事項(xiàng)
- session的數(shù)據(jù)傳輸任務(wù)能且只能
在子線程上執(zhí)行
等龙。 - 只有NSURLConnection才支持
同步任務(wù)
处渣。 - 同時實(shí)現(xiàn)
回調(diào)block
和代理方法
,默認(rèn)只調(diào)用前者
蛛砰。 - 如果采用block進(jìn)行回調(diào)罐栈,系統(tǒng)會對session進(jìn)行默認(rèn)
代理支持
。 - session的
delegate
負(fù)責(zé)處理session和task級別的回調(diào)泥畅。 - 用完的session
必須釋放
荠诬,否則會造成內(nèi)存泄漏
。因?yàn)閟ession會對其delegate
進(jìn)行強(qiáng)引用
位仁。
- session的數(shù)據(jù)傳輸任務(wù)能且只能