/*先说一下NSURLSession的用法:
1, NSURLSession 创建 NSURLSessionTask 任务
2, task任务创建完成之后,执行就OK啦
*/
/*
NSURLSessionConfiguration 设置session的一些配置 例如访问性能,到cookie,安全性,缓存策略,自定义协议,启动事件设置,以及用于移动设备优化的几个新属性
*/
NSURLSessionConfiguration * Configuration;
//独特之处在于,它会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文。
// Configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"123"];
//标配,这个跟[NSURLSession sharedSession];的时候是一样的
Configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
//没有持久性存储的缓存,Cookie或证书。无痕浏览,你懂得、、、
// Configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
#pragma mark - NSURLSessionConfiguration 的一些属性
// HTTPAdditionalHeaders 请求头
//大部分的时候不用设置,好像都是默认的
// Configuration.HTTPAdditionalHeaders = @{@"Accept": @"application/json;charset=utf-8",//设置内容类型
// @"Accept-Language": @"en",//语言
// @"Authorization": @"authString",//身份验证信息
// @"User-Agent": @"userAgentString"};//客户端类型
/*
networkServiceType
NSURLNetworkServiceTypeDefault = 0, // Standard internet traffic
NSURLNetworkServiceTypeVoIP = 1, // Voice over IP control traffic
NSURLNetworkServiceTypeVideo = 2, // Video traffic
NSURLNetworkServiceTypeBackground = 3, // Background traffic
NSURLNetworkServiceTypeVoice = 4, // Voice data
NSURLNetworkServiceTypeCallSignaling API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) = 11, // Call Signaling
这个我也没发现有什么用,也不会用。。。。
*/
Configuration.networkServiceType = NSURLNetworkServiceTypeDefault;
/*
设置该session发生的请求允许使用蜂窝流量
*/
Configuration.allowsCellularAccess = YES;
/*
"timeoutIntervalForRequest"和"timeoutIntervalForResource"请求的时间限制和获得资源的时间限制。
许多开发人员试图使用timeoutInterval去限制发送请求的总时间,但这误会了timeoutInterval的意思:同一个请求中获取第一个资源和第二个资源的时间间隔。
*/
Configuration.timeoutIntervalForRequest = 2;
Configuration.timeoutIntervalForResource = 5;
/*
HTTPMaximumConnectionsPerHost 同时持续连接的每个主机的最大数量
*/
Configuration.HTTPMaximumConnectionsPerHost = 5;
/*
是否允许使用Http通道:可以降低请求的时间,但是需要服务器支持
*/
Configuration.HTTPShouldUsePipelining = YES;
//这个必须设置后台【+backgroundSessionConfigurationWithIdentifier:】的时候,设置他才有用,他设置为YES的时候支持从后台启动
Configuration.sessionSendsLaunchEvents = YES;
//是否会使用cookie
Configuration.HTTPShouldSetCookies = YES;
//决定了该会话应该接受从服务器发出的cookie的条件
Configuration.HTTPCookieAcceptPolicy = YES;
#pragma Mark - Session的创建
NSURLSession * session;
大部分的时候我们不需要设置 Configuration
//这家伙是个单例
// session = [NSURLSession sharedSession];
//这个是默认创建一个OperationQueue处理session的消息
// session = [NSURLSession sessionWithConfiguration:Configuration];
/*
可以设定回调的delegate(注意这个回调delegate会被强引用),并且可以设定delegate在哪个OperationQueue回调,如果我们将其设置为[NSOperationQueue mainQueue]就能在主线程进行回调非常的方便。
*/
__weak typeof(self) weakSelf = self;
session = [NSURLSession sessionWithConfiguration:Configuration delegate:weakSelf delegateQueue:[NSOperationQueue mainQueue]];
NSURL * url = [NSURL URLWithString:@"http://www.tngou.net/api/drug/classify"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
#pragma mark - task的创建
/*
NSURLSessionTask : 的三个(孙)子类
NSURLSessionDataTask : 网络请求数据的任务
NSURLSessionUploadTask : 上传数据的任务 (NSURLSessionDataTask 的子类, NSURLSessionTask的孙子类)
NSURLSessionDownloadTask : 下载数据的任务
*/
NSURLSessionTask * task;
// request.timeoutInterval
// dataTaskWithURL 是指包含url的数据任务。
// dataTaskWithRequest 是指包含需要的数据任务。
// task = [session dataTaskWithURL:url];
// task = [session dataTaskWithRequest:request];
// task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// id js = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// NSLog(@"%@",js);
// }];
task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
id js = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
MMLog(@"%@",response);
MMLog(@"%@",js);
}];
[task resume];
//上传的任务
NSURLSessionUploadTask * uploadTask = [session uploadTaskWithRequest:request fromFile:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"login : %@",response);
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"login : %@",[dict objectForKey:@"message"]);
}];
[uploadTask resume];
//下载的任务
NSURLSessionDownloadTask * downLoadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSFileManager * manager = [NSFileManager defaultManager];
[manager createFileAtPath:[NSString stringWithFormat:@"%@/Documents/1.zip",NSHomeDirectory()] contents:[NSData dataWithContentsOfURL:location] attributes:nil];
NSLog(@"%@",NSHomeDirectory());
}];
[downLoadTask resume];
//其中上传的和下载的任务都可以实现断点续传。。。但是我公司不用 ,所以以后有机会再深究