使用 altool 上传 ipa 至 TestFlight

接上一篇,Jenkins 构建完成后,使用 altool 将 ipa 上传至 TestFlight。

altool

Xcode 11 之后已不再提供 Application Loader,改用 xcrun altool 上传 ipa。

altool 是 Application Loader 的命令行工具,可以用来验证和上传 app 文件至 App Store。

可以在这里找到它:

1
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool

添加 shell

xcodebuild -exportArchive 步骤完成后,我们能得到一个打包好的 ipa 文件,注意导出使用的 ExportOptions.plistmethodapp-store

1
2
<key>method</key>
<string>app-store</string>

接下来 Add build step -> Execute Shell 添加一个新的 shell 脚本。

1
2
3
4
5
6
# --upload-app 上传 --validate-app 验证
xcrun altool --upload-app \
-f path_to_app.ipa \
-u email@sample.com \
-p @keychain:APP_SPECIFIC \
--output-format normal

altool 可以 --validate-app 验证和 --upload-app 上传,-f 指向 ipa 地址,-u -p 分别是 Apple ID 用户名和密码。这里密码需要注意一下,如果 Apple ID 开启了双重认证,需要给该 ID 生成一个 APP-SPECIFIC PASSWORD

image-20181115143746906

如果未开启双重认证,那么密码就是 Apple ID 的密码。

@keychain

在 shell 脚本中使用明文密码是不理智的,我们可以使用 Keychain 来保存密码。

image-20181115144841295

在 Keychain Access 新增 item。接下来 -p @keychain:APP_SPECIFIC 指定 item name 就好了。注意 Account Name 需要和 -u username 一致。

等待一段时间,如下提示就没什么问题了:

1
2
No errors validating archive at path_to_app.ipa
No errors uploading 'path_to_app.ipa'

反过来如果有错误,也会有很详细的提示。

也可以使用 --output-format xml 获得更详细的输出。

一个小提示

每次 TestFlight 发布测试都会询问你的 app 有没有使用加密技术,勾选完后才能测试。这时可以在 Info.plist 添加 ITSAppUsesNonExemptEncryptionfalse 就可以了。

1
<key>ITSAppUsesNonExemptEncryption</key><false/>

下次打包上传,接收到 App Store Connect 邮件 has completed processing 就能自动发布测试了(internal testing)。

参考

Apple help - Upload your app binary files with altool

Stack Overflow - ITSAppUsesNonExemptEncryption export compliance while internal testing?