博客> iOS开发之网络探索
iOS开发之网络探索
2019-10-23 05:58 评论:0 阅读:1477 825111984
ios NSURLSession AFNetworking NSURLProtocol

目录

  1. 网络层框架 NSURLSession&&NSURLConnection
  2. 网络层Cookie -HTTPCookieStorage
  3. 网络层安全等级 SSL Pinning -URLCredentialStorage
  4. 网络层HTTP缓存策略 - URLRequestCachePolicy
  5. 网络层自定义协议 - URLProtocol
  6. 网络层其他设置 - URLSessionConfiguration
  7. AFN源码分析

1. 网络层框架 NSURLSession&&NSURLConnection

A.NSURLConnection

NSURLConnection是基于Core Fundation/CFNetwork API的抽象,指代的是Foundation框架的URL加载系统,关联组件有NSURLRequestNSURLResponseNSURLProtocolNSURLCacheNSHTTPCookieStorageNSURLCredentialSTorage 以及NSURLConnection NSURLRequest 被传递给NSURLConnection 被委托对象(遵守非正式协议<NSURLConnectionDelegate><NSURLConnectionDataDelegate>)异步的返回一个NSURLResponse以及服务器返回的NSDataNSURLConnection 发送请求时的线程情况,NSURLConnection被设计成异步发送,调用了start方法后,NSURLConnection会新建一些线程用底层的CFSocket去发送和接收请求,在发送和接收的一些事件发生后通知原来的线程的RunLoop去回调事件。 NSURLConnection的同步方法sendSynchronousRequest方法也是基于异步的,同样要在其他线程去处理请求的发送和接收,只是同步方法会手动block住线程,发送状态的通知也不是通过RunLoop进行。

B.NSURLSession ( NSConnection的继任者)

iOS7后推出了NSURLSession,它具备了NSURLConnection所具备的方法。同时也比它强大 NSURLSession 也可以发送Get/Post请求,实现文件下载和上传。与NSURLSession关联的API包括 NSURLRequest NSURLCacheNSURLSessionConfiguration 以及 NSURLSessionTask

在NSURLSession 中,任何请求都可以被看做一个任务。其中有三种任务类型

1. NSURLSessionDataTask     :普通的GET/POST请求
2. NSURLSessionDownloadTask :文件下载
3. NSURLSessionUploadTask   :文件上传

--a.普通出站请求

//NSURLSession 发送请求非常简单,与 NSURLConnection 不同的是,任务创建后需要手动开始执行任务。

// 1.得到session对象 NSURLSession session = [NSURLSession sharedSession]; NSURL url = [NSURL URLWithString:@""]; NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 2.创建一个task,任务(GET)
NSURLSessionDataTask* dataTask = 
         [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

    // data 为返回数据
}];

// 3.开始任务
[dataTask resume];

--b.NSURLSessionUploadTask 提交 文件上传

// Upload task 的创建需要使用一个 request,另外加上一个要上传的 NSData 对象或者是一个本地文件的路径对应的 NSURL

NSURL URL = [NSURL URLWithString:@"http://example.com/upload"]; NSURLRequest request = [NSURLRequest requestWithURL:URL]; NSData *data = ...;

NSURLSession session = [NSURLSession sharedSession]; NSURLSessionUploadTask uploadTask = [session uploadTaskWithRequest:request from[removed] 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 这个属性,而不是 allowsCellularAccess,因为前者会把 WiFi 和电源的可用性考虑在内。

timeoutIntervalForRequest 和 timeoutIntervalForResource 分别指定了对于请求和资源的超时间隔。许多开发人员试图使用 timeoutInterval 去限制发送请求的总时间,但其实它真正的含义是:分组(packet)之间的时间。实际上我们应该使用 timeoutIntervalForResource 来规定整体超时的总时间,但应该只将其用于后台传输,而不是用户实际上可能想要去等待的任何东西。

HTTPMaximumConnectionsPerHost 是 Foundation 框架中 URL 加载系统的一个新的配置选项。它曾经被 NSURLConnection 用于管理私有的连接池。现在有了 NSURLSession,开发者可以在需要时限制连接到特定主机的数量。

HTTPShouldUsePipelining 这个属性在 NSMutableURLRequest 下也有,它可以被用于开启 HTTP 管线化(HTTP pipelining),这可以显着降低请求的加载时间,但是由于没有被服务器广泛支持,默认是禁用的。

sessionSendsLaunchEvents 是另一个新的属性,该属性指定该 session 是否应该从后台启动。

connectionProxyDictionary 指定了 session 连接中的代理服务器。同样地,大多数面向消费者的应用程序都不需要代理,所以基本上不需要配置这个属性。


7. AFN源码分析

为什么使用AFN,而不直接使用原生API?AFNetworking在并发请求的同时如何管理线程的?

1)首先,AFN和其他网络框架一样解决了实现接口和所有网络请求统一管理。

2)原生API,NSURLConnection提供了两个类方法发起同步异步请求,当进行并发请求的时候,需要考虑很多问题,如异步请求所在的子线程生命周期,线程资源竞争,加锁,避免死锁等,当异步请求发起后,子线程会等待网络响应,苹果提供了delegate和block两种方式来帮助开发者处理请求时的线程问题,NURLConnection只完成了单个线程的操作,并没有提供解决多个网络请求时多个线程的管理问题,(这个问题其实可以用NSOperationQueue来解决,替开发者进行队列操作,如创建线程池等),AFN很好的解决了这个问题。后来推出的NSURLSession和AFN是同一个思想,NSURLSession内部维护了两个操作对列,一个处理session的相关回调,一个处理response响应相关的回调。

3)AFN将网络请求继承于NSOperation,将请求加入操作队列,所有和线程相关的操作都在队列里执行,帮开发者进行了队列操作,使用者只需要关注业务参数即可,提高开发效率。


相关链接: 1.https://blog.austinchou.com/dns-anti-spoofing-using-nsurlprotocol-and-happydns/ 2.https://developer.apple.com/library/tvos/documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/index.html 3.http://nshipster.cn/nsurlprotocol/

收藏
0
sina weixin mail 回到顶部