URLSession

URLSession
NSURLSession是iOS7中新的網(wǎng)絡(luò)接口头滔,與NSURLConnection是并列的啡莉。
當(dāng)程序在前臺時(shí)辉浦,NSURLSession與NSURLConnection大部分可以互相替代
NSURLSession支持后臺網(wǎng)絡(luò)操作冯痢,除非用戶強(qiáng)行關(guān)閉

NSURLSession提供的功能:
通過URL將數(shù)據(jù)下載到內(nèi)存
通過URL將數(shù)據(jù)下載到文件系統(tǒng)
將數(shù)據(jù)上傳到指定URL
在后臺完成上述功能

對于小型數(shù)據(jù)野芒,例如用戶登錄呜师、下載小圖像娶桦、JSON & XML仍然使用NSURLConnection的異步或同步方法即可

[圖片上傳中。汁汗。衷畦。(1)]

NSURLSession的使用
使用NSURLSessionConfiguration來配置NSURLSession對象
用NSURLSession對象來啟動(dòng)一個(gè)NSURLSessionTask對象

也可以使用系統(tǒng)全局的sharedSession單例來滿足大多數(shù)的需求

注:相比較NSURLConnection的返回處理,NSURLSession提供了靈活的數(shù)據(jù)返回方式知牌,可以使用簡單的block方式來處理返回?cái)?shù)據(jù)祈争,也可以使用更強(qiáng)大的delegate
NSURLSessionConfiguration
作用:用于定義和配置NSURLSession對象

每一個(gè)NSURLSession對象都可以設(shè)置不同的NSURLSessionConfiguration,從而滿足應(yīng)用內(nèi)不同類型的網(wǎng)絡(luò)請求

NSURLSessionConfiguration的三種類型:
defaultSessionConfiguration默認(rèn)session配置角寸,類似NSURLConnection的標(biāo)準(zhǔn)配置菩混,使用硬盤來存儲(chǔ)緩存數(shù)據(jù)
ephemeralSessionConfiguration臨時(shí)session配置,與默認(rèn)配置相比扁藕,這個(gè)配置不會(huì)將緩存沮峡、cookie等存在本地,只會(huì)存在內(nèi)存里亿柑,所以當(dāng)程序退出時(shí)邢疙,所有的數(shù)據(jù)都會(huì)消失
backgroundSessionConfiguration后臺session配置,與默認(rèn)配置類似望薄,不同的是會(huì)在后臺開啟另一個(gè)線程來處理網(wǎng)絡(luò)數(shù)據(jù)
NSURLSessionTask
NSURLSession使用NSURLSessionTask來具體執(zhí)行網(wǎng)絡(luò)請求的任務(wù)

NSURLSessionTask支持網(wǎng)絡(luò)請求的取消疟游、暫停和恢復(fù),比如下載文件暫停之后再恢復(fù)就能夠自動(dòng)從上次的進(jìn)度繼續(xù)下載
NSURLSessionTask還能獲取數(shù)據(jù)的讀取進(jìn)度

NSURLSessionTask的三種類型:
NSURLSessionDataTask 處理一般的NSData數(shù)據(jù)對象痕支,比如通過GET或POST方式從服務(wù)器獲取JSON或XML返回等等乡摹,但不支持后臺獲取
NSURLSessionUploadTask 用于上傳文件,支持后臺上傳
NSURLSessionDownloadTask 用于下載文件采转,支持后臺下載
通過HTTP PUT方法實(shí)現(xiàn)文件上傳的步驟
實(shí)例化NSMutableURLRequest并指定HTTPMethod為PUT

設(shè)置請求的授權(quán)
授權(quán)字符串格式:用戶名:口令
授權(quán)模式:Basic base64編碼的授權(quán)字符串
為HTTPHeaderField的Authorization賦值
文件上傳的請求部分

  1. URLRequest
    NSURL *url = [NSURL URLWithString:@"http://localhost/uploads/xxx.png"];
    NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0f];
    requestM.HTTPMethod = @"PUT";

設(shè)置用戶授權(quán)
1> 授權(quán)字符串(用戶名+密碼)
NSString *authStr = @"admin:123456";
2> BASE 64編碼
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Str = [authData base64EncodedStringWithOptions:0];
NSString *auth = [NSString stringWithFormat:@"BASIC %@", base64Str];

[requestM setValue:auth forHTTPHeaderField:@"Authorization"];
1.NSURLSession的基本使用

  • 1.1 涉及知識點(diǎn)

(1)使用步驟

使用NSURLSession創(chuàng)建task,然后執(zhí)行task

(2)關(guān)于task

a.NSURLSessionTask是一個(gè)抽象類聪廉,本身不能使用瞬痘,只能使用它的子類
b.NSURLSessionDataTask\NSURLSessionUploadTask\NSURLSessionDownloadTask
(3)發(fā)送get請求

1.創(chuàng)建NSURLSession對象(可以獲取單例對象)
NSURLSession *session = [NSURLSession sharedSession];

2.根據(jù)NSURLSession對象創(chuàng)建一個(gè)Task

NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=ss&pwd=ss&type=JSON"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

方法參數(shù)說明

注意:該block是在子線程中調(diào)用的,如果拿到數(shù)據(jù)之后要做一些UI刷新操作板熊,那么需要回到主線程刷新
第一個(gè)參數(shù):需要發(fā)送的請求對象
block:當(dāng)請求結(jié)束拿到服務(wù)器響應(yīng)的數(shù)據(jù)時(shí)調(diào)用block
block-NSData:該請求的響應(yīng)體
block-NSURLResponse:存放本次請求的響應(yīng)信息框全,響應(yīng)頭,真實(shí)類型為NSHTTPURLResponse
block-NSErroe:請求錯(cuò)誤信息

NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {

拿到響應(yīng)頭信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

4.解析拿到的響應(yīng)數(shù)據(jù)
NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);

}];

3.執(zhí)行Task
注意:剛創(chuàng)建出來的task默認(rèn)是掛起狀態(tài)的干签,需要調(diào)用該方法來啟動(dòng)任務(wù)(執(zhí)行任務(wù))
[dataTask resume];

(4)發(fā)送get請求的第二種方式

注意:該方法內(nèi)部默認(rèn)會(huì)把URL對象包裝成一個(gè)NSURLRequest對象(默認(rèn)是GET請求)
方法參數(shù)說明

第一個(gè)參數(shù):發(fā)送請求的URL地址
block:當(dāng)請求結(jié)束拿到服務(wù)器響應(yīng)的數(shù)據(jù)時(shí)調(diào)用block
block-NSData:該請求的響應(yīng)體
block-NSURLResponse:存放本次請求的響應(yīng)信息津辩,響應(yīng)頭,真實(shí)類型為NSHTTPURLResponse
block-NSErroe:請求錯(cuò)誤信息

  • (nullable NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error))completionHandler;

(5)發(fā)送POST請求

1.創(chuàng)建NSURLSession對象(可以獲取單例對象)
NSURLSession *session = [NSURLSession sharedSession];

2.根據(jù)NSURLSession對象創(chuàng)建一個(gè)Task

NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];

創(chuàng)建一個(gè)請求對象容劳,并這是請求方法為POST喘沿,把參數(shù)放在請求體中傳遞
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
拿到響應(yīng)頭信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

解析拿到的響應(yīng)數(shù)據(jù)
NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);

}];

3.執(zhí)行Task
注意:剛創(chuàng)建出來的task默認(rèn)是掛起狀態(tài)的,需要調(diào)用該方法來啟動(dòng)任務(wù)(執(zhí)行任務(wù))
[dataTask resume];

2.NSURLSession下載文件-代理

  • 2.1 涉及知識點(diǎn)

(1)創(chuàng)建NSURLSession對象竭贩,設(shè)置代理(默認(rèn)配置)

1.創(chuàng)建NSURLSession,并設(shè)置代理

第一個(gè)參數(shù):session對象的全局配置設(shè)置蚜印,一般使用默認(rèn)配置就可以
第二個(gè)參數(shù):誰成為session對象的代理
第三個(gè)參數(shù):代理方法在哪個(gè)隊(duì)列中執(zhí)行(在哪個(gè)線程中調(diào)用),如果是主隊(duì)列那么在主線程中執(zhí)行,如果是非主隊(duì)列留量,那么在子線程中執(zhí)行

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

(2)根據(jù)Session對象創(chuàng)建一個(gè)NSURLSessionDataTask任務(wù)(post和get選擇)

創(chuàng)建task
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];

注意:如果要發(fā)送POST請求窄赋,那么請使用dataTaskWithRequest,設(shè)置一些請求頭信息
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url];

(3)執(zhí)行任務(wù)(其它方法,如暫停楼熄、取消等)

啟動(dòng)task
[dataTask resume];
其它方法忆绰,如取消任務(wù),暫停任務(wù)等
[dataTask cancel];
[dataTask suspend];

(4)遵守代理協(xié)議可岂,實(shí)現(xiàn)代理方法(3個(gè)相關(guān)的代理方法)
1.當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
session:發(fā)送請求的session對象
dataTask:根據(jù)NSURLSession創(chuàng)建的task任務(wù)
response:服務(wù)器響應(yīng)信息(響應(yīng)頭)
completionHandler:通過該block回調(diào)错敢,告訴服務(wù)器端是否接收返回的數(shù)據(jù)

-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler
2.當(dāng)接收到服務(wù)器返回的數(shù)據(jù)時(shí)調(diào)用
該方法可能會(huì)被調(diào)用多次

-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data
3.當(dāng)請求完成之后調(diào)用該方法
不論是請求成功還是請求失敗都調(diào)用該方法,如果請求失敗缕粹,那么error對象有值伐债,否則那么error對象為空

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

(5)當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候,告訴服務(wù)器接收數(shù)據(jù)(調(diào)用block)

默認(rèn)情況下致开,當(dāng)接收到服務(wù)器響應(yīng)之后峰锁,服務(wù)器認(rèn)為客戶端不需要接收數(shù)據(jù),所以后面的代理方法不會(huì)調(diào)用
如果需要繼續(xù)接收服務(wù)器返回的數(shù)據(jù)双戳,那么需要調(diào)用block,并傳入對應(yīng)的策略
NSURLSessionResponseCancel = 0, 取消任務(wù)
NSURLSessionResponseAllow = 1, 接收任務(wù)
NSURLSessionResponseBecomeDownload = 2, 轉(zhuǎn)變成下載
NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3, 轉(zhuǎn)變成流
completionHandler(NSURLSessionResponseAllow);
3.NSURLSessionDownloadTask實(shí)現(xiàn)大文件下載

  • 3.1 涉及知識點(diǎn)

(1)使用NSURLSession和NSURLSessionDownload可以很方便的實(shí)現(xiàn)文件下載操作
第一個(gè)參數(shù):要下載文件的url路徑
第二個(gè)參數(shù):當(dāng)接收完服務(wù)器返回的數(shù)據(jù)之后調(diào)用該block
location:下載的文件的保存地址(默認(rèn)是存儲(chǔ)在沙盒中tmp文件夾下面虹蒋,隨時(shí)會(huì)被刪除)
response:服務(wù)器響應(yīng)信息,響應(yīng)頭
error:該請求的錯(cuò)誤信息

說明:downloadTaskWithURL方法已經(jīng)實(shí)現(xiàn)了在下載文件數(shù)據(jù)的過程中邊下載文件數(shù)據(jù)飒货,邊寫入到沙盒文件的操作
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL * __nullable location, NSURLResponse * __nullable response, NSError * __nullable error)
(2)downloadTaskWithURL內(nèi)部默認(rèn)已經(jīng)實(shí)現(xiàn)了變下載邊寫入操作魄衅,所以不用開發(fā)人員擔(dān)心內(nèi)存問題
(3)文件下載后默認(rèn)保存在tmp文件目錄,需要開發(fā)人員手動(dòng)的剪切到合適的沙盒目錄
(4)缺點(diǎn):沒有辦法監(jiān)控下載進(jìn)度
4.使用NSURLSessionDownloadTask實(shí)現(xiàn)大文件下載-監(jiān)聽下載進(jìn)度

(1)創(chuàng)建NSURLSession并設(shè)置代理塘辅,通過NSURLSessionDownloadTask并以代理的方式來完成大文件的下載

1.創(chuàng)建NSULRSession,設(shè)置代理
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

2.創(chuàng)建task
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_
01.mp4”];
self.downloadTask = [self.session downloadTaskWithURL:url];

3.執(zhí)行task
[self.downloadTask resume];

(2)常用代理方法的說明

1.當(dāng)接收到下載數(shù)據(jù)的時(shí)候調(diào)用,可以在該方法中監(jiān)聽文件下載的進(jìn)度
該方法會(huì)被調(diào)用多次
totalBytesWritten:已經(jīng)寫入到文件中的數(shù)據(jù)大小
totalBytesExpectedToWrite:目前文件的總大小
bytesWritten:本次下載的文件數(shù)據(jù)大小

-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

2.恢復(fù)下載的時(shí)候調(diào)用該方法
fileOffset:恢復(fù)之后晃虫,要從文件的什么地方開發(fā)下載
expectedTotalBytes:該文件數(shù)據(jù)的總大小

-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes

3.下載完成之后調(diào)用該方法

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

4.請求完成之后調(diào)用
如果請求失敗,那么error有值

-(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error
                                      ```

(3)實(shí)現(xiàn)斷點(diǎn)下載相關(guān)代碼

如果任務(wù)扣墩,取消了那么以后就不能恢復(fù)了

[self.downloadTask cancel];

如果采取這種方式來取消任務(wù)哲银,那么該方法會(huì)通過resumeData保存當(dāng)前文件的下載信息
只要有了這份信息扛吞,以后就可以通過這些信息來恢復(fù)下載
[self.downloadTask cancelByProducingResumeData:^(NSData * __nullable resumeData) {
self.resumeData = resumeData;
}];

繼續(xù)下載
首先通過之前保存的resumeData信息,創(chuàng)建一個(gè)下載任務(wù)
self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];

[self.downloadTask resume];

(4)計(jì)算當(dāng)前下載進(jìn)度
獲取文件下載進(jìn)度
self.progress.progress = 1.0 * totalBytesWritten/totalBytesExpectedToWrite;

(5)局限性
01 如果用戶點(diǎn)擊暫停之后退出程序荆责,那么需要把恢復(fù)下載的數(shù)據(jù)寫一份到沙盒滥比,代碼復(fù)雜度更
02 如果用戶在下載中途未保存恢復(fù)下載數(shù)據(jù)即退出程序,則不具備可操作性

5.使用NSURLSessionDataTask實(shí)現(xiàn)大文件離線斷點(diǎn)下載(完整)
- 5.1 涉及知識點(diǎn)

  (1)關(guān)于NSOutputStream的使用
 
  1. 創(chuàng)建一個(gè)輸入流,數(shù)據(jù)追加到文件的屁股上
  把數(shù)據(jù)寫入到指定的文件地址做院,如果當(dāng)前文件不存在盲泛,則會(huì)自動(dòng)創(chuàng)建
  NSOutputStream *stream = [[NSOutputStream alloc]initWithURL:[NSURL fileURLWithPath:[self fullPath]] append:YES];
  
  2. 打開流
  [stream open];
  
  3. 寫入流數(shù)據(jù)
  [stream write:data.bytes maxLength:data.length];
  
  4.當(dāng)不需要的時(shí)候應(yīng)該關(guān)閉流
  [stream close];
 
  (2)關(guān)于網(wǎng)絡(luò)請求請求頭的設(shè)置(可以設(shè)置請求下載文件的某一部分)
 
  1. 設(shè)置請求對象
  1.1 創(chuàng)建請求路徑
  NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
  
  1.2 創(chuàng)建可變請求對象
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  
  1.3 拿到當(dāng)前文件的殘留數(shù)據(jù)大小
  self.currentContentLength = [self FileSize];
  
  1.4 告訴服務(wù)器從哪個(gè)地方開始下載文件數(shù)據(jù)
  NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentContentLength];
  NSLog(@"%@",range);
  
  1.5 設(shè)置請求頭
  [request setValue:range forHTTPHeaderField:@"Range"];
 
  (3)NSURLSession對象的釋放
 
  -(void)dealloc

{
在最后的時(shí)候應(yīng)該把session釋放,以免造成內(nèi)存泄露
NSURLSession設(shè)置過代理后键耕,需要在最后(比如控制器銷毀的時(shí)候)調(diào)用session的invalidateAndCancel或者
resetWithCompletionHandler寺滚,才不會(huì)有內(nèi)存泄露
[self.session invalidateAndCancel];

[self.session resetWithCompletionHandler:^{
    
    NSLog(@"釋放---");
}];

}
(4)優(yōu)化部分

  01 關(guān)于文件下載進(jìn)度的實(shí)時(shí)更新
  02 方法的獨(dú)立與抽取

6.NSURLSession實(shí)現(xiàn)文件上傳
- 6.1 涉及知識點(diǎn)

  (1)實(shí)現(xiàn)文件上傳的方法
   第一個(gè)參數(shù):請求對象
   第二個(gè)參數(shù):請求體(要上傳的文件數(shù)據(jù))
   block回調(diào):
   NSData:響應(yīng)體
   NSURLResponse:響應(yīng)頭
   NSError:請求的錯(cuò)誤信息
  NSURLSessionUploadTask *uploadTask =  [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error)

(2)設(shè)置代理,在代理方法中監(jiān)聽文件上傳進(jìn)度
調(diào)用該方法上傳文件數(shù)據(jù)
如果文件數(shù)據(jù)很大屈雄,那么該方法會(huì)被調(diào)用多次
參數(shù)說明:
totalBytesSent:已經(jīng)上傳的文件數(shù)據(jù)的大小
totalBytesExpectedToSend:文件的總大小

 -(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend

{
NSLog(@"%.2f",1.0 * totalBytesSent/totalBytesExpectedToSend);
}
(3)關(guān)于NSURLSessionConfiguration相關(guān)

 01 作用:可以統(tǒng)一配置NSURLSession,如請求超時(shí)等
 02 創(chuàng)建的方式和使用
 
 創(chuàng)建配置的三種方式
 + (NSURLSessionConfiguration *)defaultSessionConfiguration;
 + (NSURLSessionConfiguration *)ephemeralSessionConfiguration;
 + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *

)identifier NS_AVAILABLE(10_10, 8_0);

 統(tǒng)一配置NSURLSession
 -(NSURLSession *)session

{
if (_session == nil) {

    創(chuàng)建NSURLSessionConfiguration
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    設(shè)置請求超時(shí)為10秒鐘
    config.timeoutIntervalForRequest = 10;
    
    在蜂窩網(wǎng)絡(luò)情況下是否繼續(xù)請求(上傳或下載)
    config.allowsCellularAccess = NO;
    
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
}
return _session;

}
NSURLSessionConfiguration筆記
NSURLSessionConfiguration對象用于初始化NSURLSession對象村视。
展開請求級別中與NSMutableURLRequest相關(guān)的可供選擇的方案,我們可以看到NSURLSessionConfiguration對于會(huì)話如何產(chǎn)生請求棚亩,提供了相當(dāng)多的控制和靈活性蓖议。從網(wǎng)絡(luò)訪問性能虏杰,到cookie讥蟆,安全性,緩存策略纺阔,自定義協(xié)議瘸彤,啟動(dòng)事件設(shè)置,以及用于移動(dòng)設(shè)備優(yōu)化的幾個(gè)新屬性笛钝,你會(huì)發(fā)現(xiàn)你一直在尋找的质况,正是NSURLSessionConfiguration。
會(huì)話在初始化時(shí)復(fù)制它們的配置玻靡,NSURLSession有一個(gè)只讀的配置屬性结榄,使得該配置對象上的變化對這個(gè)會(huì)話的政策無效。配置在初始化時(shí)被讀取一次囤捻,之后都是不會(huì)變化的臼朗。

-構(gòu)造方法
NSURLSessionConfiguration有三個(gè)類構(gòu)造函數(shù),這很好地說明了NSURLSession是為不同的用例而設(shè)計(jì)的蝎土。

  • "defaultSessionConfiguration"返回標(biāo)準(zhǔn)配置视哑,這實(shí)際上與NSURLConnection的網(wǎng)絡(luò)協(xié)議棧是一樣的,具有相同的共享NSHTTPCookieStorage誊涯,共享NSURLCache和共享NSURLCredentialStorage挡毅。
  • "ephemeralSessionConfiguration"返回一個(gè)預(yù)設(shè)配置,沒有持久性存儲(chǔ)的緩存暴构,Cookie或證書跪呈。這對于實(shí)現(xiàn)像"秘密瀏覽"功能的功能來說段磨,是很理想的。
  • "backgroundSessionConfiguration":獨(dú)特之處在于庆械,它會(huì)創(chuàng)建一個(gè)后臺會(huì)話薇溃。后臺會(huì)話不同于常規(guī)的,普通的會(huì)話缭乘,它甚至可以在應(yīng)用程序掛起沐序,退出,崩潰的情況下運(yùn)行上傳和下載任務(wù)堕绩。初始化時(shí)指定的標(biāo)識符策幼,被用于向任何可能在進(jìn)程外恢復(fù)后臺傳輸?shù)氖刈o(hù)進(jìn)程提供上下文。

想要查看更多關(guān)于后臺會(huì)話的信息奴紧,可以查看WWDC Session 204: “What’s New with Multitasking”
-NSURLSessionConfiguration的屬性
NSURLSessionConfiguration擁有20個(gè)屬性特姐。熟練掌握這些屬性的用處,將使應(yīng)用程序充分利用其網(wǎng)絡(luò)環(huán)境黍氮。
最重要的屬性:
替代 request 中的forHTTPHeaderField 告訴服務(wù)器有關(guān)客戶端的附加信息
"HTTPAdditionalHeaders"指定了一組默認(rèn)的可以設(shè)置出站請求的數(shù)據(jù)頭唐含。這對于跨會(huì)話共享信息,如內(nèi)容類型沫浆,語言捷枯,用戶代理,身份認(rèn)證专执,是很有用的淮捆。
WebDav的身份驗(yàn)證
NSString *userPasswordString = [NSString stringWithFormat:@"%@:%@", user, password];
NSData * userPasswordData = [userPasswordString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64EncodedCredential = [userPasswordData base64EncodedStringWithOptions:0];
NSString *authString = [NSString stringWithFormat:@"Basic: %@", base64EncodedCredential];

設(shè)置客戶端類型
NSString *userAgentString = @"iPhone AppleWebKit";

configuration.HTTPAdditionalHeaders = @{@"Accept": @"application/json",
@"Accept-Language": @"en",
@"Authorization": authString,
@"User-Agent": userAgentString};

"networkServiceType(網(wǎng)絡(luò)服務(wù)類型)"對標(biāo)準(zhǔn)的網(wǎng)絡(luò)流量,網(wǎng)絡(luò)電話本股,語音攀痊,視頻,以及由一個(gè)后臺進(jìn)程使用的流量進(jìn)行了區(qū)分拄显。大多數(shù)應(yīng)用程序都不需要設(shè)置這個(gè)

"allowsCellularAccess(允許蜂窩訪問)"和"discretionary(自行決定)"被用于節(jié)省通過蜂窩連接的帶寬苟径。建議在使用后臺傳輸?shù)臅r(shí)候,使用discretionary屬性躬审,而不是allowsCellularAccess屬性棘街,因?yàn)樗鼤?huì)把WiFi和電源可用性考慮在內(nèi)

"timeoutIntervalForRequest"和"timeoutIntervalForResource"指定了請求以及該資源的超時(shí)時(shí)間間隔。許多開發(fā)人員試圖使用timeoutInterval去限制發(fā)送請求的總時(shí)間盒件,但這誤會(huì)了timeoutInterval的意思:報(bào)文之間的時(shí)間蹬碧。timeoutIntervalForResource實(shí)際上提供了整體超時(shí)的特性,這應(yīng)該只用于后臺傳輸炒刁,而不是用戶實(shí)際上可能想要等待的任何東西

"HTTPMaximumConnectionsPerHost"是Foundation 框架中URL加載系統(tǒng)的一個(gè)新的配置選項(xiàng)恩沽。它曾經(jīng)被用于NSURLConnection管理私人連接池。現(xiàn)在有了NSURLSession翔始,開發(fā)者可以在需要時(shí)限制連接到特定主機(jī)的數(shù)量
"HTTPShouldUsePipelining"也出現(xiàn)在NSMutableURLRequest罗心,它可以被用于開啟HTTP管道里伯,這可以顯著降低請求的加載時(shí)間,但是由于沒有被服務(wù)器廣泛支持渤闷,默認(rèn)是禁用的
"sessionSendsLaunchEvents" 是另一個(gè)新的屬性疾瓮,該屬性指定該會(huì)話是否應(yīng)該從后臺啟動(dòng)
"connectionProxyDictionary"指定了會(huì)話連接中的代理服務(wù)器。同樣地飒箭,大多數(shù)面向消費(fèi)者的應(yīng)用程序都不需要代理狼电,所以基本上不需要配置這個(gè)屬性
關(guān)于連接代理的更多信息可以在 CFProxySupport Reference 找到。
"Cookie Policies"
-"HTTPCookieStorage" 是被會(huì)話使用的cookie存儲(chǔ)弦蹂。默認(rèn)情況下肩碟,NSHTTPCookieShorage的 + sharedHTTPCookieStorage會(huì)被使用,這與NSURLConnection是相同的
-"HTTPCookieAcceptPolicy" 決定了該會(huì)話應(yīng)該接受從服務(wù)器發(fā)出的cookie的條件
-"HTTPShouldSetCookies" 指定了請求是否應(yīng)該使用會(huì)話HTTPCookieStorage的cookie
"Security Policies"
URLCredentialStorage 是會(huì)話使用的證書存儲(chǔ)凸椿。默認(rèn)情況下削祈,NSURLCredentialStorage 的+ sharedCredentialStorage 會(huì)被使用使用,這與NSURLConnection是相同的
"TLSMaximumSupportedProtocol" 和 "TLSMinimumSupportedProtocol" 確定是否支持SSLProtocol版本的會(huì)話
"Caching Policies"
URLCache 是會(huì)話使用的緩存脑漫。默認(rèn)情況下髓抑,NSURLCache 的 + sharedURLCache 會(huì)被使用,這與NSURLConnection是相同的
requestCachePolicy 指定了一個(gè)請求的緩存響應(yīng)應(yīng)該在什么時(shí)候返回优幸。這相當(dāng)于NSURLRequest 的-cachePolicy方法
"Custom Protocols"
protocolClasses是注冊NSURLProtocol類的特定會(huì)話數(shù)組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吨拍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劈伴,更是在濱河造成了極大的恐慌凶硅,老刑警劉巖炼幔,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寄症,死亡現(xiàn)場離奇詭異帕识,居然都是意外死亡或详,警方通過查閱死者的電腦和手機(jī)喝噪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門捣域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來故觅,“玉大人燥撞,你說我怎么就攤上這事座柱。” “怎么了物舒?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵色洞,是天一觀的道長。 經(jīng)常有香客問我冠胯,道長火诸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任荠察,我火速辦了婚禮置蜀,結(jié)果婚禮上奈搜,老公的妹妹穿的比我還像新娘。我一直安慰自己盯荤,他們只是感情好馋吗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秋秤,像睡著了一般宏粤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灼卢,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天商架,我揣著相機(jī)與錄音,去河邊找鬼芥玉。 笑死蛇摸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灿巧。 我是一名探鬼主播赶袄,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抠藕!你這毒婦竟也來了饿肺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤盾似,失蹤者是張志新(化名)和其女友劉穎敬辣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體零院,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溉跃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了告抄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撰茎。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖打洼,靈堂內(nèi)的尸體忽然破棺而出龄糊,到底是詐尸還是另有隱情,我是刑警寧澤募疮,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布炫惩,位于F島的核電站,受9級特大地震影響阿浓,放射性物質(zhì)發(fā)生泄漏他嚷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爸舒。 院中可真熱鬧蟋字,春花似錦、人聲如沸扭勉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涂炎。三九已至忠聚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唱捣,已是汗流浹背两蟀。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留震缭,地道東北人赂毯。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像拣宰,于是被迫代替她去往敵國和親党涕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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