Kingsly的iOS开发进阶专题待读清单iOS Developer

iOS9 ATS HTTP/2 NSURLSession

2017-03-22  本文已影响968人  Jerry4me

本文主要是看了

做出的翻译和总结, 文字/视频链接如下 :


App Transfer Security


iOS9新特性. 核心是防止用户的个人隐私数据被意外泄漏. 加强默认Configuration的安全性.

HTTP

以前HTTP请求是明文传输(clearText)的, 别人拦截请求之后就能获取所有信息.

HTTPS

HTTPS通过在TCP于HTTP层之间加入一层SSL/TLS层, 能做到 :

HTTPS in iOS

苹果希望所有所有请求都使用HTTPS来加强安全性, 但是也有以下几种例外(以下全部可以在info.plist文件中配置) :

使用NSAllowsArbitraryLoads可以检测app中加载失败是不是因为ATS的原因.

CFNetwork中用于网络诊断的环境变量CFNETWORK_DIAGNOStICS = 1 : 所有加载失败的URL都能被确定是URL错误还是底层TLS错误. 这样能进一步排查错误.

下面为ATS新增的属性

NSURLSession新特性


NSURLSession将全面支持HTTP/2 !

为什么需要HTTP/2

由于HTTP/1.1存在许多问题 :

了解HTTP/2

between HTTP/1.1 and HTTP/2

HTTP/2 有什么改进 :

HTTP/2 多路复用

Q : HTTP/2多路复用是如何队首阻塞的问题的?

A : 在HTTP/1.1的时候曾试过采用HTTP pipelining (HTTP 管道/流水线 技术)能实现同一TCP连接中不用等待旧请求的响应就可以发送新请求. 但是HTTP pipelining有个致命的缺点 : HTTP响应仍然是按照请求的顺序依次收到.

HTTP/2 多路复用+请求优先级, 发送的时候还是依次发送请求, 但是与此同时我们同时得到了回复, 同时, 更高优先级的请求我们得到以及发送给客户端的速度更快, 如下图所示 :

HTTP/2 Multiplexing

服务器自推送

在HTTP/1.1时代, 我们没有服务器自推送, 只能发一个请求, 得到响应之后再发第二个请求... 延迟可想而知 :

HTTP/1.1 without Server Push

而在HTTP/2时代, 我们有了服务器自推送, 服务器会把相关联的数据全部push给我们 :

HTTP/2 with Server Push

性能马上强了一大截, 我们再也不用像以前那样苦苦等待了.

并且这功能已经内嵌在NSURLSession中, 我们不需要写任何一行代码来支持其实现.

iOS中适配HTTP/2

NSURLSession已经自动支持HTTP/2, 客户端不需要额外写任何代码. 只需要一台支持HTTP/2通信的服务器即可. 哎呀, 要是没有怎么办, 也没关系, 看下面 :

我们一句代码, 判断都不用写, 省事又省心.

SPDY

这里说句题外话, 虽然SPDY并不在该Session中提及, 但是与HTTP/2有异曲同工之处, SPDY在之前被认为是未来的HTTP/2, 所以这里说一下.

SPDY是Google开发的基于TCP的应用层协议, 通过头部压缩, 多路复用和优先级来缩短网页的加载时间和提高安全性. 可以说是HTTP/1.1的一个优化版.

更多有关SPDY的详情请见这里


惊 ! iOS9开始苹果弃用NSURLConnection, 不再维护NSURLConnection, 所有有关Networking的新API只会在NSURLSession上更新.

NSURLSession replace NSURLConnection

NSURLSession的新功能


cookie 共享

增加sessionCookieGroup以实现app与其扩展(例如通知中心等等)之间cookie的共享.

let ident = "group.mycompany.mygroupname" 
let cookieStorage = NSHTTPCookieStorage.sharedCookieStorageForGroupContainerIdentifier(
    identifier: ident)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.HTTPCookieStorage = cookieStorage
let session = NSURLSession(configuration: config)

NSURLSessionStreamTask

以前我们使用NSInputStream/NSOutputStream来进行一些非HTTP的连接, 例如利用TCP连接一台远程的服务器等等, 现在我们有了NSURLSessionStreamTask让我们更简单地实现以上功能.

NSURLSessionStreamTask的特性 :

NSURLSessionTaskMetrics

对发送请求/DNS查询/TLS握手/请求响应等各种环节时间上的统计. 更易于我们检测, 分析我们的请求缓慢到底是发生在哪个环节, 并对此进行优化提升我们APP的性能.

下面开始介绍NSURLSessionTaskMetrics的属性

Property

NSURLSessionTaskTransactionMetrics

property

另外, 需要注意的是, 如果请求命中了cache, 上述很多值会为nil.

API

NSURLSessionTaskDelegate代理中新增一个方法- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics, 当收集完成的时候就会调用该方法.

我们只需要实现代理的这个方法就能在这里做统计, 输出等等操作.

Something else

苹果不再支持RC4加密.


以上图片均来自官方WWDC中的PDF.

参考资料 :
HTTP/2
NSURLSession
NSURLSessionTaskMetrics

上一篇 下一篇

猜你喜欢

热点阅读