从Xcode11开始,Application Loader不再集成在Xcode中,需要使用xcodebuild或者xcrun altool命令上传应用。
xcrun altool
Xcode11以下的命令是这样的:
- ➜ ~ xcrun altool
- Copyright (c) 2009-2019, Apple Inc. Version 4.00.1181
- Usage: altool --validate-app -f <file> -t <platform> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
- altool --upload-app -f <file> -t <platform> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
- altool --notarize-app -f <file> --primary-bundle-id <bundle_id> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>} [--asc-provider <provider_shortname>]
- altool --notarization-info <uuid> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
- altool --notarization-history <page> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>} [--asc-provider <provider_shortname>]
- altool --list-apps -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
- altool --store-password-in-keychain-item <name_for_keychain_item> -u <username> -p <password>
- Authentication: Most commands require authorization.
- There are two methods available: user name with password, and apiKey with apiIssuer.
- -u, --username <username> Username. Required to connect for validation, upload, and notarization.
- -p, --password <password> Password. Required if username specified and apiKey/apiIssuer are not.
- If this argument is not supplied on the command line, it will be read from stdin.
- Alternatively to entering <password> in plaintext, it may also be specified using a '@keychain:'
- or '@env:' prefix followed by a keychain password item name or environment variable name.
- Example: '-p @keychain:<name>' uses the password stored in the keychain password item named <name>.
- You can create and update keychain items with the
- --store-password-in-keychain-item command.
- Example: '-p @env:<variable>' uses the value in the environment variable named <variable>
- --apiKey <api_key> apiKey. Required for JWT authentication while using validation, upload, and notarization.
- This option will search the following directories in sequence for a private key file
- with the name of 'AuthKey_<api_key>.p8': './private_keys', '~/private_keys', '~/.private_keys',
- and '~/.appstoreconnect/private_keys'.
- --apiIssuer <issuer_id> Issuer ID. Required if --apiKey is specified.
- -f, --file <file> <file> specifies the path to the file to process.
- -t, --type {osx | ios | appletvos} Specify the platform of the file.
- --primary-bundle-id <bundle_id> Used with --notarize-app to uniquely identify a package.
- --asc-provider <provider_shortname> Required with --notarize-app and --notarization-history when a user account is associated with multiple
- providers.
- -v, --validate-app Validates an app archive for the App Store. Authentication and -f are required.
- --upload-app Uploads the given app archive to the App Store. Authentication and -f are required.
- --list-apps Display all apps associated with your account(s).
- --notarize-app Uploads the given app package, dmg or zip file for notarization. Authentication, -f,
- and --primary-bundle-id are required. --asc-provider is required for an account associated with multiple providers.
- If successful, the UUID associated with the upload is returned.
- --notarization-info <uuid> Returns the status and log file URL of a package previously uploaded for notarization with the specified <uuid>.
- Authentication is required. The log file can be retrieved with 'curl <log_file_url>'.
- --notarization-history <page> Returns a list of all uploads submitted for notarization. <page> specifies a range of entries where 0
- returns the most recent number of entries. A new page value will be returned which can be used as the
- <page> value to the next use of --notarization-history and so forth until no more items are returned.
- Authentication is required. --asc-provider is required for an account associated with multiple providers.
- --store-password-in-keychain-item <name_for_keychain_item> -u <username> -p <password>
- Stores the password <password> in the keychain item named <name_for_keychain_item> associated with the account <username>.
- If an item with that name and account already exists in the keychain, its password will be updated. Otherwise a new item
- is created with that name. You can use this keychain item with the -p option to mask your password with other commands.
- Example: altool --store-password-in-keychain-item MY_SECRET -u jappleseed@apple.com -p "MyP@ssw0rd!@78"
- altool --notarize-app -u jappleseed@apple.com -p @keychain:MY_SECRET [...]
- --output-format {xml | normal} Specifies how the output is formatted. 'xml' displays the output in a structured format; 'normal' displays in
- an unstructured format (default).
- --verbose Enable logging output.
- -h, --help Display this output.
账号密码的方式上传包体,如下:
先验证 :
- xcrun altool --validate-app -f 包体绝对路径.ipa -t iOS -u 用户名 -p 密码
示例:
再上传:
- xcrun altool --upload-app -f 包体绝对路径.ipa -t iOS -u 用户名 -p 密码
示例:
如果出错:
*** Error: Unable to validate archive '/Users/jingyin/Desktop/***.ipa': ( "Error Domain=ITunesSoftwareServiceErrorDomain Code=-22020 "We are unable to create an authentication session." UserInfo={NSLocalizedDescription=We are unable to create an authentication session., NSLocalizedFailureReason=Unable to validate your application.}"
|
有可能是密码需要使用动态密码。而不是原来账号的密码。需要先登录账号,获取到动态密码,再用在此处。
官方文档
如果验证成功:
- No errors validating archive at '/Users/yoyo/Desktop/***.ipa'
上传成功:
- No errors uploading '/Users/yoyo/Desktop/***.ipa'
除了可以用账号密码的方式,还可以通过这种方式 Creating API Keys for App Store Connect API
截了整屏并且用插件翻译了一下方便大家参照一下:
注意到新的参数如下:
- --apiKey <api_key> --apiIssuer <issuer_id>
- $ cd ~
- $ mkdir .private_keys
- #这个时候就在你的根目录下生产了一个名叫private_keys隐藏文件夹
- $ ls -la
- #使用这个命令你就可以看到你根目录下所有的文件,包括刚刚创建的.private_keys
- $ cd .private_keys/
- $ pwd
- #进入这个文件夹,并用pwd打印文件夹路径,记录这个路径后面有用
- cd 文件夹
- #进入你存放apiKey所在的文件夹层级
- mv /Users/yoyo/xxx.p8 /Users/yoyo/.private_keys
或者,复制一份也可以:
- cp /Users/yoyo/WorkFiles/Yoyos/iOS证书/AuthKey_4Fxxx.p8 /Users/yoyo/.private_keys
OK,到这一步就把你的文件放到了该放的地方
执行命令:
- xcrun altool --validate-app -f 包的绝对路径 -t ios -u 你的苹果账号 --apiKey 密钥的ID --apiIssuer Issuer ID
示例:
- xcrun altool --validate-app -f /Users/yoyo/Downloads/__UNI__E9A9411_1016141110.ipa -t ios -u 398927951love@sina.com --apiKey 4xxxx3 --apiIssuer exxxx-eaxxx
出现以下提示即为正常:
➜ ~ xcrun altool --validate-app -f /Users/yoyo/Downloads/__UNI__E9A9411_1016141110.ipa -t ios -u 398927951love@sina.com --apiKey 4xxxx3 --apiIssuer exxxx-eaxxx
Generated JWT: eyJhbGciOiJFUzI1NiIsImtpZCI6IjRGRFg0QlNOOTMiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE1NzEyMDkyODYsImlzcyI6ImViNThjYmQ1LTBiNzUtNGJkOC1iNGE5LWVhZDA4OTM4YmRjZCIsImF1ZCI6ImFwcHN0b3JlY29ubmVjdC12MSIsImlhdCI6MTU3MTIwODA4Nn0.K3aEZHyIBpHw2TH7xyZZohY4iLpSKqxhuyXQd82x__95edperJQjV55Cpj1c1PuhZOyQxeF39vQtRZe7AXhSDg
No errors validating archive at '/Users/yoyo/Downloads/__UNI__E9A9411_1016141110.ipa'
主要是最后一行:No errors
那就是通过了验证了,尤其是红色框体里的话.接下来执行上传命令(这行命令不需要-u):
- xcrun altool --upload-app -f 包的绝对路径 -t ios --apiKey 密钥的ID --apiIssuer Issuer ID
执行完上传命令耐心等待后,如果没有什么error信息那就是上传成功了,这个时候去App Store Connect中完成你需要填写的信息就可以提审了.
一点小tips:
altool这种上传方法最大好处是每次你失败后错误信息都会告诉你错哪了,所以每次看到错误信息可以翻译过来认真读下,相信会对你有所启示~
如果你尝试了各种上传方法还是没有效果,最后试试用手机4G信号开热点给电脑共享.
最后,如有错误,恳请纠正,联系QQ:398927951,邮箱:398927951love@sina.com