一、怎么得到 Cronet 编译包

  1. 源码编译

能够参阅 google 官方的指南 来编译。但编译过程十分坎坷,一路下来会遇到十分多的过错。不主张运用这种方法

  1. 运用编译好的

Google Cloud

谷歌在 Google Cloud 提供了编译好的包,编译周期十分短,基本上每天都有新包。选取指定的版别号下载即可。

iOS 集成 Cronet 方法和测试过程

gsutil

下载需求 gsutil 东西,可经过下面的方法来装置

pip3 install gsutil

选择合适的版别

经过浏览版别记载,最新的版别是 2023.6.8 编译的 116.0.5820.0

iOS 集成 Cronet 方法和测试过程

Debug的就不必说了,肯定不能用到线上。

  • Release-iphonesimultor:intel芯片x86_64模拟器包

  • Release-m1 simulator:M1芯片模拟器+真机包

    不主张运用此包,目前公司还有同学在运用 intel 芯片开发,假如运用包含M1芯片的包,会导致项目编译不经过。

持续往前寻找,咱们发现 2023.6.16 编译的 114.0.5735.140

iOS 集成 Cronet 方法和测试过程

  • 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 两个包,打包成一个同时包含 arm64x86_64的包。能够运用静态包,也能够运用动态包。

lipo -create xxxx yyy -output Cronet

合并完之后,经过 file或许lipo -info指令检查包的架构

iOS 集成 Cronet 方法和测试过程

二、怎么集成

新建好项目,将 Cronet.framework 添加到项目中,为了能成功编译运转起来,还需求将一些依赖的体系库添加到项目中。

iOS 集成 Cronet 方法和测试过程

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-AgentDummy/1.0

iOS 集成 Cronet 方法和测试过程

调查到 User-AgentDummy/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)

iOS 集成 Cronet 方法和测试过程

能够看到 Protocol 是 QUIC, 在demo中也将识别出的 Protocol显示出来是 H3

稍等片刻,再次发起相同的恳求,咱们也能很轻易调查到 0-RTT现象,这对网络传输提速是十分有用的

iOS 集成 Cronet 方法和测试过程

经过以上测验能够得到结论,集成的Cronet工作正常,对支撑H3的恳求运用的是QUIC协议。

五、其他评论

Apple 的 NSURLSession 自身有许多好处,不必开发者参与即可主动支撑,Cronet 是否也是呢?如下

NSURLSession Cronet
QUIC
IPv6
TCP Fast Open
TLS 1.3
Multipath TCP

Cronet 运用还在探究之中,如有过错之处,欢迎指出一起评论。