Skip to content

Instantly share code, notes, and snippets.

@dlo
Last active February 2, 2024 02:18
Show Gist options
  • Save dlo/1568eb5d3317d8b98bc393e58b0f84b2 to your computer and use it in GitHub Desktop.
Save dlo/1568eb5d3317d8b98bc393e58b0f84b2 to your computer and use it in GitHub Desktop.
Xcode script that automatically uploads builds to iTunes Connect after archive

Summary

This script will automatically upload your app to iTunes Connect after a successful Xcode archive action.

After doing this about a million times by hand (i.e., opening the Organizer, clicking on "Upload to App Store", waiting for teams to load, etc.), I decided I'd had enough. Now, I just go to "Product" > "Archive", sip my margherita, and kick up my feet while the world marvels at my genius, while my app gets distributed to my testers without lifting but a finger. Or...I just take a bathroom break. Either way, it's pretty awesome.

Yes, yes, I know you can do this completely via fastlane, but I'm somewhat sadistic and prefer to do my archiving completely within Xcode.

Instructions

To make this work, open up the build scheme you use to submit your App Store builds, go to "Archive", and then "Post-actions". Click the "+" and "Add Run Script Action". Then, paste in the contents of post_action.sh, replacing "[email protected]" with your iTunes Connect username.

Lastly, place iTunesExportOptions.plist in your project directory. Depending on your needs (e.g., if you want to distribute enterprise builds) you may need to make some tweaks. See xcodebuild -help for more details. By default, it assumes you just want to submit the build to the App Store / TestFlight.

Dependencies

pilot from fastlane.

gem install pilot

You may want to run pilot at least one time prior, interactively on the command line, so that your credentials are saved for future use.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
</dict>
</plist>
IPA_EXPORT_DIR=$(mktemp -d)
ITUNES_USERNAME="[email protected]"
xcodebuild -exportArchive -exportOptionsPlist "${PROJECT_DIR}/iTunesExportOptions.plist" -archivePath "${ARCHIVE_PATH}" -exportPath "${IPA_EXPORT_DIR}"
pilot upload --skip_waiting_for_build_processing --username $ITUNES_USERNAME -i "${IPA_EXPORT_DIR}/${PRODUCT_NAME}.ipa"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment