Self-hosted adhoc IPA delivery of iOS apps

Although this may be old hat for many, I recently learned this from an iOS project I’ve been working on.

With the acquisition of Testflight by Apple, you can now do iOS beta-testing directly through iTunes Connect, and you don’t need device UDIDs to get your adhoc IPAs on your testers’ devices. But what if, like this recent project, you have to target iOS 7 (Testflight beta testing from Apple only works on iOS 8 and up)? And what if you don’t want to wait for Apple’s beta review process before a beta app goes out?

In that case, you can host your adhoc IPAs for download on your own server. First you have to do the old process of getting device UDIDs from your testers, entering them into iTunes connect, and creating a distribution provisioning profile with those devices enabled.

Once you’ve done all that, and you’ve created your adhoc IPA, you can go ahead and upload that file to your server. Remember where you put it, because you’ll need the full URL to your ipa in the next steps.

Create a .plist file on your server with the following data in it. You’ll need to enter the full URL to your IPA, the bundle ID of your app, its current version, and its name. Make sure to remove the brackets from the code below when entering your values.

Sample .plist file:

<?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>items</key>
	<array>
		<dict>
			<key>assets</key>
			<array>
				<dict>
					<key>kind</key>
					<string>software-package</string>
					<key>url</key>
					<string>[http://yourserver.com/path/to/ipa]</string>
				</dict>
			</array>
			<key>metadata</key>
			<dict>
				<key>bundle-identifier</key>
				<string>[com.yourcompany.yourgame]</string>
				<key>bundle-version</key>
				<string>c[urrent version of your app]</string>
				<key>kind</key>
				<string>software</string>
				<key>title</key>
				<string>[name of your app]</string>
			</dict>
		</dict>
	</array>
</dict>
</plist>

Save that as a .plist file, and upload it to your server. Remember the full URL to the .plist file.

Next, create a HTML file on your server with the following code in it, replacing the part with the full URL to your plist:

<a href="itms-services://?action=download-manifest&url=http://yourserver.com/path/to/plist">click here to install<a>

Navigate to that page on your device, click the link, and it should work! (assuming the adhoc provisioning profile you built your app with contains permissions for your device)

Leave a Reply

Your email address will not be published. Required fields are marked *