NSURLSession基本特点
- 用于替代 NSURLConnection
- 支持后台运行的网络任务
- 暂停、停止、重启网络任务,不再需要 NSOperation 封装
- 请求可以使用同样的配置容器
- 直接使用系统方法可以实现文件上传和下载
- 通过代理方法可以获取文件上传和下载的进度
- block 和代理都对文件上传和下载起作用
- 当文件上传时,block和代理可以同时使用
- 当文件下载时,block和代理不要同时使用
NSURLSession结构图
- 为了方便程序员使用,苹果提供了一个全局 session.
- 所有的 任务(Task) 都是由 session 发起的.
- 所有的任务默认是挂起的,需要 resume.
- session可以自定义,自定义的时候可以同时设置代理.
- session : 如果你要监听上传进度,就不能使用单例session,因为监听上传进度需要使用代理.我们需要自定义session
NSURLSessionConfiguration
用于设置全局的网络会话属性,包括:身份验证,超时时长,缓存策略,Cookie 等.
- 常用属性
三个类构造方法,是为不同的案例设计的.
defaultSessionConfiguration 返回标准配置,具有共享 NSHTTPCookieStorage,NSURLCache 和 NSURLCredentialStorage.
ephemeralSessionConfiguration 返回一个预设配置,没有持久性存储的缓存,Cookie或证书。这对于实现像秘密浏览功能的功能来说,是很理想的.
backgroundSessionConfiguration,独特之处在于,会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文.
常用 HTTPAdditionalHeaders
//接收数据类型,语言,设备类型
configuration.HTTPAdditionalHeaders = @{
@"Accept": @"application/json",
@"Accept-Language": @"en",
@"User-Agent": @"iPhone"
};
- NSURLSessionConfiguration使用.
/// 自定义session,设置配置信息 @property (nonatomic, strong) NSURLSession
*session;
//开发中没有额外需求可以不用设置
- (NSURLSession *)session {
if (_session == nil) {
// 创建配置信息 : 开发中只需要使用默认的配置信息就好了
// 当多个任务共享同一个session时候,我们只需要配置一次config,那么有session发起的所有任务,都具备相同的配置信息
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
// 请求的超时时长是1秒
config.timeoutIntervalForRequest = 5.0;
config.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
// 告诉服务器我的设备
config.HTTPAdditionalHeaders = @{@"User-Agent": @"iPhone"};
_session = [NSURLSession sessionWithConfiguration:config];
}
return _session;
}
NSURLSession的GET请求
- 准备URL
- session
- 发起任务(task)
- 启动任务(resume)
- 处理响应
/// NSURLSession的GET请求 (默认也是GET请求)
- (void)demo {
// URL
NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php?username=zhangsan&password=zhang"];
// 获取session(单例)
NSURLSession *session = [NSURLSession sharedSession];
// 发起任务
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 处理响应
if (error == nil && data != nil) {
// 反序列化
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@",result);
} else {
NSLog(@"%@",error);
}
}];
// 启动任务
[dataTask resume];
}
NSURLSession的POST请求
- 准备URL
- 创建可变request (设置请求方法和请求体)
- session
- 发起任务(task)
- 启动任务(resume)
- 处理响应
- (void)login {
// URL
NSURL *URL = [