Installing your developer app »Over the Air« without syncing with iTunes [Updated]
This article is also available in serbo-croatic, thanks to Anja Skrba from webhostinggeeks
When you develop your DPS app (or any iOS app) you then, near the end, need to test the app on your device and also send it to your clients for them to test.
The most obvious way for distributing was always sending the .ipa file via email to your client, let them drag it into iTunes and sync their iPads with iTunes. This is a tedious process, for you and for the client.
But you can also distribute your development app »Over the Air« and install right from the iPad browser. This is available for Pro and Enterprise, even Single Edition.
Note: This will not bypass the App Store for final distribution. This is only for testing your development app and you still need the UDIDs of all the iPads you want to test on (Enterprise customers can sign an app without the UDID binding).
In short: You create a xml manifest.plist file and upload it with your .ipa file and one icon to your own server. You then create a special link that points to the manifest and the iPad will then install the app wirelessly to the provisioned iOS device.
You just need three files:
- Your developer-viewer.ipa
- A 57 × 57 icon
- manifest.plist file describing your app
So basically, you have everything ready except the manifest.plist file which we will look at now.
manifest.plist file
The manifest.plist file is a short xml file that describes the location and metadata of your app:
You can create this file in your text editor. You can start with this example. Basically you just need to edit 4 places:
software-package: url http://nybok.de/viewer/developer-viewer.ipa
First, change the url value inside to the absolute location (including the full http://-Link) of the .ipa file you will upload later
display-image: url http://nybok.de/viewer/apple-adhoc-57.png
The same for the 57 pixel png icon
bundle-identifier: de.nybok.showcase
The bundle identifier has to exactly match the one you see in the overview in Viewer Builder
title: our lovely showcase
this required string will be visible in the alert dialog prior to installing.
If there’s something wrong in the manifest file you probably won’t get an error later — the app will just not install, which makes this a bit hard to test.
Uploading the files
Then upload all the files onto your webserver. Your webserver should serve the manifest.plist file as text/xml plist and the ipa file as application/octet-stream ipa (should work on most servers).
If you don’t have a webserver, your public dropbox directory might work as well.
Generating the special URL
Then you just need to point your iPad to the the manifest.plist file with this special URL:
itms-services://?action=download-manifest& ;;;;url=https://nybok.de/viewer/manifest.plist
Note that you should serve the link to the plist file through HTTPS.
This will load the manifest.plist file in which the iPad will look up for the .ipa file and — if everything looks ok — starts the download on the iOS device.
Of course this URL is not fun to type in and looks ugly. You can use a shortening URL to make the URL more readable. Unfortunately, bit.ly does not allow shortening itms-services://-URLs. I only know of tinyurl.com that will do this and where you can also set up a custom short URL. So the shortened URL I use here is
http://tinyurl.com/nybok-showcase
which I then just type into the iPad’s Browser or send via eMail to my client.
I use this type of distribution for any app I create, even for tests on my own because it is so easy, once set up you just need to replace the ipa file on your server.
Update 8/16: As a few people pointed out to me, there are services that do these things for you. Namely TestFlight and HockeyApp. They are great, especially for beta-testing your app including bug reporting. (Not the best workflow for DPS) But they do not allow anonymous installation and are not entirely free. Diawi is a service that does this anonymously and easy. With the procedure above you have all the files on your own server.