为何我的 Fastlane 上传那么慢?

自动化

使用自动化工具处理 iOS 的 TestFlight 分发,是一件很惬意的事情,它能帮你节省很多时间,减少大量人工干预——尤其是像这种需要等很久才需要人工操作一下的事情,虽然并不会让你觉得很累,但大量的时间就这样浪费掉了。

使用 fastlane 一键编译、上传,然后等待苹果服务器处理完成,全自动发布 TestFlight,本来是一个很棒的操作,但由于网络环境的变化,我的 fastlane 上传速度变得越来越慢,最终慢到 100M 带宽的网络中,上传速度只有 10 KB/s。

重置 itmstransporter

由于 fastlane 实际上是使用 itmstransporter 来进行上传的,那么如果你遇到上传相关错误,可以尝试重置这个工具(当然,在我这个情况下就无法解决问题)

参考文献:https://stackoverflow.com/questions/47433541/app-store-upload-is-really-slow-and-hogging-my-internet-connection

itmstransporter 的三种传输模式

实际上,itmstransporter 是有三种上传模式的,这也就是为什么你在使用 Xcode 手动上传 app 时,会有一个步骤叫做“协商上传模式”。但显然,这个协商功能没那么“智能”。

如果你依赖 itmstransporter 的自动选择(默认就是如此),那么最快的上传模式会最先被使用,但一旦这个模式失败,itmstransporter 就会转用其他备用方案了(实际上如果再试试,也许还是能用的)

DAV

这个模式是最慢的模式,其实就和直接 http 上传没什么区别(会比web上传更慢一些),如果你的网络质量比较差,延迟高等,那么落到 dav 是没跑的。

但是,有一点,如果你在公司等有防火墙的网络环境,那么 dav 可能是唯一不被封锁的上传方式——它不需要特殊端口。

Signiant

这是一个 SaaS 加速传输协议,官方宣称比 http 传输快 200%,使用这个协议则需要防火墙开启 TCP 和 UDP 的 44001 端口,并且 UDP 攻击防护有可能会对 signiant 造成影响。

Aspera

Aspera 在业内极其出名,很多企业网络、云平台都在使用使用 Aspera 家的 fasp 协议快速传输数据,它在绝大多数网络条件下拥有稳定高速传输,“通常需要 26 小时将一份体积为24GB的文档传输至世界的另一端,而 Aspera 能做到只需 30 秒”。

同样,它也要求防火墙开启 TCP 和 UDP 的 33001 端口,并且 UDP 攻击防护有可能会对 Aspera 造成影响。

配置

我们的目的就是要让 fastlane 调用 itmstransporter 时使用 Aspera 进行上传,避免使用其他两个协议,如果是直接使用 itmstransporter ,你大可以直接设置参数,但使用 fastlane 该怎么办呢?

在你的 upload_to_testflight 上一行,写 ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"] = "-t Aspera" 即可,这样,就设定了环境变量,让 itmstransporter 只使用 Aspera 进行上传,一旦失败,则不会再使用其他方式进行尝试,这样在上传时,你就会遇到:

不过,如果你耐心等待,就会发现上传并没有停止,最终,你会得到:

另外,上传的速度也恢复到了巅峰。

如果你真的遇到 Aspera 被防火墙阻止而无法上传的情况,那么就吧 Aspera 改成 DAV。

速度优化

更正:对于 fastlane 来说,-k 参数不能使用,似乎是默认脚本已经设定了这个参数,如果使用,你会得到一个错误: The option: "-k" may only be specified once. Return status of iTunes Transporter was 1: The option: "-k" may only be specified once.

默认来说,Aspera 不会对上传进行限速,也就是说它会尽可能利用你的上传带宽,但这样有一个弊端,那就是上传的时候会导致网络上行带宽被占满,其他人、其他软件都无法联网。所以给 Aspera 增加一个带宽限制是个不错的选择(另外,据说加了带宽限定后速度反而是略有提升的)。

总之,在 "-t Aspera" 中增加 -k 参数,后接你期望的带宽,单位是 bit per second,即 -k 10000 就是 10M 带宽, -k 200000 就是 200M 带宽,具体多少合适,这需要你自己去实际测试,这也和你的路由器性能有关。

比如,我要设置 20M 带宽,那么最终的代码就是这样的:

另: -k 这个参数对 signiant 模式同样适用,单位和规则都是一样的。

参考文献

Transporter User Guide 1.13

 

本文由 落格博客 原创撰写:落格博客 » 为何我的 Fastlane 上传那么慢?

转载请保留出处和原文链接:https://www.logcg.com/archives/3235.html

About the Author

R0uter

如非声明,本人所著文章均为原创手打,转载请注明本页面链接和我的名字。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注