Xcode11找不到Application Loader解决方式
iOS 2019-10-16 14:16:29

从Xcode11开始,Application Loader不再集成在Xcode中,需要使用xcodebuild或者xcrun altool命令上传应用。

xcrun altool

Xcode11以下的命令是这样的:

C/C++ Code复制内容到剪贴板
  1. ➜  ~ xcrun altool  
  2. Copyright (c) 2009-2019, Apple Inc. Version 4.00.1181  
  3.   
  4. Usage: altool --validate-app -f <file> -t <platform> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}  
  5.        altool --upload-app -f <file> -t <platform> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}  
  6.        altool --notarize-app -f <file> --primary-bundle-id <bundle_id> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>} [--asc-provider <provider_shortname>]  
  7.        altool --notarization-info <uuid> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}  
  8.        altool --notarization-history <page> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>} [--asc-provider <provider_shortname>]  
  9.        altool --list-apps -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}  
  10.        altool --store-password-in-keychain-item <name_for_keychain_item> -u <username> -p <password>  
  11.   
  12. Authentication: Most commands require authorization.  
  13.                 There are two methods available: user name with password, and apiKey with apiIssuer.  
  14.   
  15.                 -u, --username <username> Username. Required to connect for validation, upload, and notarization.  
  16.                 -p, --password <password> Password. Required if username specified and apiKey/apiIssuer are not.  
  17.                                           If this argument is not supplied on the command line, it will be read from stdin.  
  18.                                           Alternatively to entering <password> in plaintext, it may also be specified using a '@keychain:'  
  19.                                           or '@env:' prefix followed by a keychain password item name or environment variable name.  
  20.                                           Example: '-p @keychain:<name>' uses the password stored in the keychain password item named <name>.  
  21.                                                                          You can create and update keychain items with the  
  22.                                                                          --store-password-in-keychain-item command.  
  23.                                           Example: '-p @env:<variable>'  uses the value in the environment variable named <variable>  
  24.   
  25.                 --apiKey <api_key>        apiKey. Required for JWT authentication while using validation, upload, and notarization.  
  26.                                           This option will search the following directories in sequence for a private key file  
  27.                                           with the name of 'AuthKey_<api_key>.p8':  './private_keys''~/private_keys''~/.private_keys',  
  28.                                           and '~/.appstoreconnect/private_keys'.  
  29.                 --apiIssuer <issuer_id>   Issuer ID. Required if --apiKey is specified.  
  30.   
  31.  -f, --file <file>                   <file> specifies the path to the file to process.  
  32.  -t, --type {osx | ios | appletvos}  Specify the platform of the file.  
  33.   
  34.      --primary-bundle-id <bundle_id> Used with --notarize-app to uniquely identify a package.  
  35.   
  36.      --asc-provider <provider_shortname> Required with --notarize-app and --notarization-history when a user account is associated with multiple  
  37.                                          providers.  
  38.   
  39.  -v, --validate-app                  Validates an app archive for the App Store. Authentication and -f are required.  
  40.      --upload-app                    Uploads the given app archive to the App Store. Authentication and -f are required.  
  41.      --list-apps                     Display all apps associated with your account(s).  
  42.   
  43.      --notarize-app                  Uploads the given app package, dmg or zip file for notarization. Authentication, -f,  
  44.                                      and --primary-bundle-id are required. --asc-provider is required for an account associated with multiple providers.  
  45.                                      If successful, the UUID associated with the upload is returned.  
  46.   
  47.      --notarization-info <uuid>      Returns the status and log file URL of a package previously uploaded for notarization with the specified <uuid>.  
  48.                                      Authentication is required. The log file can be retrieved with 'curl <log_file_url>'.  
  49.   
  50.      --notarization-history <page>   Returns a list of all uploads submitted for notarization. <page> specifies a range of entries where 0  
  51.                                      returns the most recent number of entries. A new page value will be returned which can be used as the  
  52.                                      <page> value to the next use of --notarization-history and so forth until no more items are returned.  
  53.                                      Authentication is required. --asc-provider is required for an account associated with multiple providers.  
  54.   
  55.      --store-password-in-keychain-item <name_for_keychain_item> -u <username> -p <password>  
  56.                                      Stores the password <password> in the keychain item named <name_for_keychain_item> associated with the account <username>.  
  57.                                      If an item with that name and account already exists in the keychain, its password will be updated. Otherwise a new item  
  58.                                      is created with that name. You can use this keychain item with the -p option to mask your password with other commands.  
  59.                                      Example: altool --store-password-in-keychain-item MY_SECRET -u jappleseed@apple.com -p "MyP@ssw0rd!@78"  
  60.                                               altool --notarize-app -u jappleseed@apple.com -p @keychain:MY_SECRET [...]  
  61.   
  62.      --output-format {xml | normal}  Specifies how the output is formatted. 'xml' displays the output in a structured format; 'normal' displays in  
  63.                                      an unstructured format (default).  
  64.   
  65.      --verbose                       Enable logging output.  
  66.   
  67.  -h, --help                          Display this output.  

 

账号密码的方式上传包体,如下:

先验证 :

C/C++ Code复制内容到剪贴板
  1. xcrun altool --validate-app -f 包体绝对路径.ipa -t iOS -u 用户名 -p 密码  

示例:

 

 

再上传:

C/C++ Code复制内容到剪贴板
  1. 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.}"

有可能是密码需要使用动态密码。而不是原来账号的密码。需要先登录账号,获取到动态密码,再用在此处。官方文档

 

如果验证成功: 

C/C++ Code复制内容到剪贴板
  1. No errors validating archive at '/Users/yoyo/Desktop/***.ipa'  

 

上传成功: 

C/C++ Code复制内容到剪贴板
  1. No errors uploading '/Users/yoyo/Desktop/***.ipa'  

 

 

 

除了可以用账号密码的方式,还可以通过这种方式 Creating API Keys for App Store Connect API

截了整屏并且用插件翻译了一下方便大家参照一下:

FireShot Capture 001 - 为App Store Connect API创建API密钥- Apple开发人员文档 - developer.apple.com.png

 

 

注意到新的参数如下: 

C/C++ Code复制内容到剪贴板
  1. --apiKey <api_key> --apiIssuer <issuer_id>  

 

C/C++ Code复制内容到剪贴板
  1. $ cd ~  
  2. $ mkdir .private_keys  
  3. #这个时候就在你的根目录下生产了一个名叫private_keys隐藏文件夹  
  4. $ ls -la  
  5. #使用这个命令你就可以看到你根目录下所有的文件,包括刚刚创建的.private_keys  
  6. $ cd .private_keys/  
  7. $ pwd  
  8. #进入这个文件夹,并用pwd打印文件夹路径,记录这个路径后面有用  

 

C/C++ Code复制内容到剪贴板
  1. cd 文件夹  
  2. #进入你存放apiKey所在的文件夹层级  
  3.   
  4. mv  /Users/yoyo/xxx.p8   /Users/yoyo/.private_keys  

 或者,复制一份也可以:

C/C++ Code复制内容到剪贴板
  1. cp /Users/yoyo/WorkFiles/Yoyos/iOS证书/AuthKey_4Fxxx.p8 /Users/yoyo/.private_keys  

 

OK,到这一步就把你的文件放到了该放的地方 

执行命令:

C/C++ Code复制内容到剪贴板
  1. xcrun altool --validate-app -f 包的绝对路径 -t ios -u 你的苹果账号 --apiKey 密钥的ID --apiIssuer Issuer ID  

 

示例:

C/C++ Code复制内容到剪贴板
  1. 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):

C/C++ Code复制内容到剪贴板
  1. xcrun altool --upload-app -f 包的绝对路径 -t ios --apiKey 密钥的ID --apiIssuer Issuer ID  

执行完上传命令耐心等待后,如果没有什么error信息那就是上传成功了,这个时候去App Store Connect中完成你需要填写的信息就可以提审了.

 

一点小tips:

altool这种上传方法最大好处是每次你失败后错误信息都会告诉你错哪了,所以每次看到错误信息可以翻译过来认真读下,相信会对你有所启示~

如果你尝试了各种上传方法还是没有效果,最后试试用手机4G信号开热点给电脑共享.

最后,如有错误,恳请纠正,联系QQ:398927951,邮箱:398927951love@sina.com

 

 

 

 

本文来自于:http://www.yoyo88.cn/study/swift/460.html

Powered by yoyo苏ICP备15045725号