一、怎么得到 Cronet 编译包
-
源码编译
能够参阅 google 官方的指南 来编译。但编译过程十分坎坷,一路下来会遇到十分多的过错。不主张运用这种方法
-
运用编译好的
Google Cloud
谷歌在 Google Cloud 提供了编译好的包,编译周期十分短,基本上每天都有新包。选取指定的版别号下载即可。
gsutil
下载需求 gsutil 东西,可经过下面的方法来装置
pip3 install gsutil
选择合适的版别
经过浏览版别记载,最新的版别是 2023.6.8 编译的 116.0.5820.0
Debug的就不必说了,肯定不能用到线上。
-
Release-iphonesimultor:intel芯片x86_64模拟器包
-
Release-m1 simulator:M1芯片模拟器+真机包
不主张运用此包,目前公司还有同学在运用 intel 芯片开发,假如运用包含M1芯片的包,会导致项目编译不经过。
持续往前寻找,咱们发现 2023.6.16 编译的 114.0.5735.140
- Release-iphonesimultor:intel芯片x86_64模拟器包
- Release-iphoneos:真机包
上面两个Release版别包,正是咱们需求的。
下载包
咱们运用 gsutil 东西来下载 114.0.5735.140 版别包。在终端履行如下指令即可
gsutil -m cp -r \
"gs://chromium-cronet/ios/114.0.5735.140/Debug-iphonesimulator" \
"gs://chromium-cronet/ios/114.0.5735.140/Debug-m1simulator" \
"gs://chromium-cronet/ios/114.0.5735.140/Release-iphoneos" \
"gs://chromium-cronet/ios/114.0.5735.140/Release-iphonesimulator" \
"gs://chromium-cronet/ios/114.0.5735.140/Release-m1simulator" \
.
合并包
经过 lipo 指令 来合并 Release-iphonesimulator 和 Release-iphoneos 两个包,打包成一个同时包含 arm64
和x86_64
的包。能够运用静态包,也能够运用动态包。
lipo -create xxxx yyy -output Cronet
合并完之后,经过 file
或许lipo -info
指令检查包的架构
二、怎么集成
新建好项目,将 Cronet.framework 添加到项目中,为了能成功编译运转起来,还需求将一些依赖的体系库添加到项目中。
Github开源demo:github.com/lyandy/ios_…
三、API实践
Cronet采用NSURLProtocol切面编程的方法阻拦了iOS体系的网络恳求,集成起来相对简略。
设置Cronet
// 设置 支撑 HTTP2, 假如设置为 NO,假如协议不支撑H3,会降级到H1.1
[Cronet setHttp2Enabled:YES];
// 设置支撑 QUIC
[Cronet setQuicEnabled:YES];
// 设置支撑 Br 压缩算法,并列的有gzip算法
[Cronet setBrotliEnabled:YES];
// 设置 AcceptLanguages,AFN会主动补全设置,主张不单独设置
// [Cronet setAcceptLanguages:@"en-US,en"];
// 设置 恳求的 UserAgent, AFN会主动补全设置,主张不单独设置
// 这是设置收效顺序 URLRequest > Cronet > 默认
// [Cronet setUserAgent:@"Dummy/1.0" partial:NO];
// 设置 HTTP Cache 类型,主张不手动指定
// [Cronet setHttpCacheType:CRNHttpCacheTypeDisabled];
// 敞开 metric 性能统计
[Cronet setMetricsEnabled:YES];
// 预先告知 Cronet,支撑 H3 的域名,以便赶快链接H3协议
[Cronet addQuicHint:@"h2o.examp1e.net" port:443 altPort:443];
// 开始cronet
[Cronet start];
// 主张不敞开,敞开后也会阻拦一切的 NSURLConnection
// 敞开后,也会对webkit加载进行阻拦。
// [Cronet registerHttpProtocolHandler];
// 是否要运用 Cronet 阻拦指定恳求
// 不写的话,会阻拦一切恳求。最好是依据自己的条件来阻拦
[Cronet setRequestFilterBlock:^BOOL(NSURLRequest* request) {
return YES;
}];
hook 网络恳求
下面是一个最简略的例子
- (void)startNSURLSession {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
[Cronet installIntoSessionConfiguration:config]; // hook Protocol
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[@"https://h2o.examp1e.net?t=" stringByAppendingString:@([[NSDate date] timeIntervalSince1970]).stringValue]]];
request.assumesHTTP3Capable = NO; // 封闭Apple QUIC
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *resp, __unused NSError *err) {
NSLog(@"");
}];
[task resume];
}
四、测验
经过Charles抓包和Wireshark网络层转包来检测Cronet是否收效。
(以下演示结果均是运用 Github开源demo:github.com/lyandy/ios_… 的试验结果)
调查链接:h2o.examp1e.net?t=xxx (此链接支撑H3
,xxx是时刻戳,避免出现LocalNetwork,H3主动降级为H2)
Charles
为了调查作用,咱们成心设置Cronet的User-Agent
为 Dummy/1.0
调查到 User-Agent
为 Dummy/1.0
,阐明 Cronet 阻拦恳求成功
Wireshark
为了避开 Apple 自身 QUIC
的搅扰,咱们成心把 Apple QUIC
封闭
request.assumesHTTP3Capable = NO;
经过 Wireshark 的过滤规则,咱们过滤出 本机Mac 和 h2o.examp1e.net 的ip
(ip.src==132.226.1.140 and ip.dst==10.6.0.107 ) or (ip.src==10.6.0.107 and ip.dst== 132.226.1.140)
能够看到 Protocol 是 QUIC
, 在demo中也将识别出的 Protocol显示出来是 H3
稍等片刻,再次发起相同的恳求,咱们也能很轻易调查到 0-RTT
现象,这对网络传输提速是十分有用的
经过以上测验能够得到结论,集成的Cronet工作正常,对支撑H3
的恳求运用的是QUIC
协议。
五、其他评论
Apple 的 NSURLSession 自身有许多好处,不必开发者参与即可主动支撑,Cronet 是否也是呢?如下
NSURLSession | Cronet | |
---|---|---|
QUIC | ✅ | ✅ |
IPv6 | ✅ | ✅ |
TCP Fast Open | ✅ | ✅ |
TLS 1.3 | ✅ | ✅ |
Multipath TCP | ✅ | ✅ |
Cronet 运用还在探究之中,如有过错之处,欢迎指出一起评论。