0%

URLSession

相关组件

  • NSURLSession
  • NSURLSessionConfiguration
  • NSURLSessionDataTask
  • NSURLSessionUploadTask
  • NSURLSessionDownloadTask

与NSURLConnection对比

改进是可以配置每个session的缓存,协议,cookie以及credential policy。每个NSURLSession对象都是一个NSURLSessionConfiguration对象来进行初始化,指定那些策略和增强移动设备上性能选项。

NSURLSessionTask

负责处理数据的加载以及文件和数据在客户端与服务器之间的上传和下载。3个子类NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask可以直接使用。这三个子类完成最基本的网络任务,获取JSON或XML数据,上传和下载文件。

所有task都是可以取消,暂停或恢复的。当download task取消时,可以通过选项创建一个resume data传递给下一次新创建的download task继续download

Get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

NSURL *URL = [NSURL URLWithString:@"http://example.com"];

NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *task = [session dataTaskWithRequest:request

completionHandler:

^(NSData *data, NSURLResponse *response, NSError *error) {

// ...

}];

[task resume];

上传NSData

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];

NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSData *data = ...;

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request

fromData:data

completionHandler:

^(NSData *data, NSURLResponse *response, NSError *error) {

// ...

}];

[uploadTask resume];

下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

NSURL *URL = [NSURL URLWithString:@"http://example.com/file.zip"];

NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request

completionHandler:

^(NSURL *location, NSURLResponse *response, NSError *error) {

//download是一点点将数据写入本地临时文件,完成后需要将文件从临时地方转移到一个永久地址保存起来。

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];

NSURL *newFileLocation = [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];

[[NSFileManager defaultManager] copyItemAtURL:location toURL:newFileLocation error:nil];

}];

[downloadTask resume];

NSURLSession的delegate方法

NSURLSession的task的delegate用来处理鉴权查询,session的delegate处理连接层,如服务器信任,客户端证书评估,NTLM和Kerberos协议问题,task处理网络请求的如Basic,Digest以及Proxy authentication等。

表示请求结束的delegate是-URLSession:task:didCompleteWithError:

NSURLSessionConfiguration

可以找到任何你想要进行配置的选项。包括可用网络,cookie,安全性,缓存策略,自定义协议,启动事件的设置,移动设备优化。

NSURLSessionConfiguration的工厂方法

  • +defaultSessionConfiguration:标准configuration,具有相同共享NSHTTPCookieStorage,共享NSURLCache和共享NSURLCredentiaStorage
  • +ephemeralSessionConfiguration:实现秘密浏览,不会对缓存,Cookie和证书持久性存储
  • +backgroundSessionConfiguration:(NSString *)identifier:

配置属性

NSURLSessionConfiguration有20个可配属性。

基本配置

  • HTTPAdditionalHeaders:设置请求的header,跨session共享信息如内容类型,语言,User agent和Author

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    NSString *userPasswordString = [NSString stringWithFormat:@"%@:%@", user, password];

    NSData * userPasswordData = [userPasswordString dataUsingEncoding:NSUTF8StringEncoding];

    NSString *base64EncodedCredential = [userPasswordData base64EncodedStringWithOptions:0];

    NSString *authString = [NSString stringWithFormat:@"Basic %@", base64EncodedCredential];

    NSString *userAgentString = @"AppName/com.example.app (iPhone 5s; iOS 7.0.2; Scale/2.0)";

    configuration.HTTPAdditionalHeaders = @{@"Accept": @"application/json",

    @"Accept-Language": @"en",

    @"Authorization": authString,

    @"User-Agent": userAgentString};

  • networkServiceType:一般不需要设置这个。

  • allowsCellularAccess和discretionary:后台传输使用discretionary这个属性。

  • timeoutIntervalForRequest和timeoutIntervalForResource:前者是packet之间请求时间。如果希望限制整体超时时间,使用后者timeoutIntervalForResource

  • HTTPMaximumConnectionsPerHost:限制连接到主机的数量

  • HTTPShouldUsePipelining:默认禁止,因为很多服务器没有支持

  • sessionSendsLaunchEvents:session是否应该从后台启动

  • connectionProxyDictionary:指定连接的代理服务器。

Cookie策略

  • HTTPCookieStorage:默认情况会使用NSHTTPCookieStorage的+sharedHTTPCookieStorage这个单例,跟NSURLConnection一样。
  • HTTPCookieAcceptPolicy:设置什么情况session应该接收服务器发出的cookie
  • HTTPShouldSetCookies:是否该存储cookie

安全策略

  • URLCredentialStorage:默认情况会使用NSURLCredentialStorage的+sharedCredentialStorage这个单例,跟NSURLConnection一样。
  • TLSMaximumSupportedProtocol和TLSMinimumSupportedProtocolLinux:是否支持SSL协议

缓存策略

  • URLCache:默认情况会使用NSURLCache的+sharedURLCache这个单例,跟NSURLConnection一样。
  • requestCachePolicy:设置什么时候应该缓存返回的响应。

自定义协议

  • protocolClasses:是NSURLProtocol的子类,配置自定义协议的数组。