Each year, Apple releases updates to its software platforms and development tools, which always comes with a bevy of changes. Xcode 11 came with an extra surprise by removing the long standing developer tool Application Loader, which was an alternative method to upload apps to Apple's Mac and iOS App Stores.
Per the Xcode 11 release notes:
Xcode supports uploading apps from the Organizer window or from the command line with xcodebuild or xcrun altool. Application Loader is no longer included with Xcode. (29008875)
Historical Background of Application Launcher and altool
If you write traditional Mac or iOS software in Xcode, you normally submit your apps to the App Store via the Organizer window in Xcode. However, if you build or distribute your software via other methods, then the Xcode Organizer may not be the way you generally upload the software. This is where Application Loader was useful by being able to take an existing app and upload the software to Apple. With that route now absent in the latest release of Xcode, alternative methods are necessary.
Application Loader was a companion developer tool that, according to its copyright date, goes as far back as 2002, but the oldest version of Application Loader I could find came with Xcode 3.2, putting it around the same time period that the iOS and Mac App Stores starting up. This app came bundled with Xcode and could be accessed via the following menu in Xcode:
Xcode > Open Developer Tool > Application Loader
Even though Application Loader has been inexplicably retired, there is an alternative solution, the command line tool altool
, which has been available since at least Xcode 6. altool
is a versatile utility which can notarize, verify, or upload an app. Considering that altool
was part of Application Loader before being moved over to the ContentDeliveryServices framework, it can perform the same duties that Application Loader handled. This post will focus on validating and uploading an app. Notarization, a relatively new security measure, will be addressed in a future post.
Validate app
xcrun altool --validate-app -f path/to/application.ipa -t ios -u <appstore_username@example.com> -p <appstore_password>
This is the same process as what Xcode uses to validate an app, and it will also return any success or error messages from the validation.
Upload App
xcrun altool --upload-app -f path/to/application.ipa -t ios -u <appstore_username@example.com> -p <appstore_password>
In these examples, appstore_password
is a per-application password you need to create at Apple's website. If you have multiple products, you will need to create a separate password for each app.
xcrun
is used to locate and run development tools on the system, which is a useful utility to have, especially in the case of using altool
, since its location has changed between Xcode 10 and Xcode 11. In Xcode 10, altool
was part of the Application Loader app (/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
), but with Xcode 11, it has been moved to be part of the ContentDeliveryServices.framework (/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework/Versions/A/Support/altool
).
Since altool
is a command line utility, it can be easily utilized in an automated system, such as with a continuous integration and deployment build process. If you prefer to use Application Loader, make sure to keep a copy of Xcode 10 around, but it is unknown how long that will continue to work, so it is a good idea to eventually migrate your process to using altool
, instead.
Using altool
with the Keychain
If you are adding altool
to a CI/CD automation flow, it is best to store the application-specific password in either an environmental variable or the macOS Keychain, instead of displaying the password in a plain text script.
To add the password to the Keychain, run the following command from the macOS Terminal:
xcrun altool --store-password-in-keychain-item <MY_SECRET> -u <appstore_username@example.com> -p <appstore_password>
MY_SECRET
is whatever value you wish to set for the name to store in the Keychain. Verify that the password was successfully saved in the Keychain (/Applications/Utilities/Keychain.app
).
To make use of the password stored in the Keychain:
xcrun altool --validate-app -f /path/to/application.ipa -t ios -u <appstore_username@example.com> -p @keychain:MY_SECRET
Transporter
About a month after Xcode 11.0 was officially released, Apple replaced the abandoned Application Loader with another app: Transporter. Transporter originated as a Java-based command-line tool for Windows, Linux, and Mac to submit content to the iTunes Store, App Store, and iBooks Store. Transporter 1.1 is now a Mac app which can also upload app binaries to App Store Connect, effectively supplanting Application Loader.
Transporter is not bundled with Xcode, but it can be downloaded from the Mac App Store and used in a similar manner to the retired Application Loader to upload .ipa or .pkg files to App Store Connect. Log in with either a App Store Connect, iTunes Connect, or encoding house account to upload your content to the appropriate portal.
Resources
- Validate and upload your app binary files with altool
- Upload your app binary files with altool
- Xcode 11 Release Notes
- Dev Journal -- Automate notarizing macOS apps
- Customizing the Notarization Workflow
- Rosyna's Tweet About altool
- WWDC 2018 - Your Apps and the Future of macOS security
- How to codesign and notarise your app for macOS 10.14 and higher
- Upload an ipa to testflight using altool
- 5 Tools for Uploading iOS apps to iTunes Connect
- New Fastlane Plugin to Upload iOS binary with altool
- Upload IPA with Application Loader from terminal
- Upload to iTunes Connect using altool
- Xcode 11 and upload IPA file without Application Loader
- How to upload IPA now that Application Loader is no longer included in Xcode 11
- Notarizing Filmulator for macOS 10.15 Catalina (Illustrated)
- Never Ending Notary Nuisance or Infinite Loop at Infinite Loop
- Manage Your Apple Account
- Upload tools
- Transporter Help
- About Transporter
- Transporter Now Available on the Mac App Store
- Upload App Previews with Transporter
- Transporter User Guide 2.0
- Transporter Getting Set Up
- Apple Brings Its 'Transporter' App for Developers to the Mac App Store
- Apple simplifies developer content uploads with Transporter app for Mac
- Transporter app simplifies submitting software, music, video to Apple