How to distribute ios application wirelessly without managing UDIDs and recompilation

I’ve been distributing my apps wirelessly for several months now with no problems. Granted, I am distributing under the Enterprise license, which costs $299 a year and is intended for internal business use. This may work with a normal developer license, but you’d have to do some testing to make sure. I imagine the process is the same if it does work. I’m using XCode 4, so this may be slightly different if you’re using a different version. Basically, you have to add an Entitlements.plist file to your resources:

New->File->Code Signing->Entitlements

and before you distribute, you have to change:

"Can be debugged" to NO

Make sure your project is set up with the correct Code signing profiles. Now go to:

Product->archive

then with your newly built entry, click on:
Share

Select "iOS App Store Package (.ipa)"

and choose the proper distribution profile you want to use. Click next, then choose a location to save the .ipa file to. Before you click Save, you need to check

Save for Enterprise Distribution

The .ipa file needs to be saved on an FTP Server, or at least that’s how I got it to work. For the “Application URL” field, use the path to the .ipa file you are going to save, for example,

ftp://ftp.company.com/Installers/myApp.ipa

Give it a Title, then in “Large Image URL” and “Small Image URL” give it a path to your large (512×512) and small (72×72) icon files, (I’m developing for iPad, so iPhone may be different). For example,

ftp://ftp.company.com/Installers/small.png

Save the .ipa file. Now you need to place your .mobileprovision file on the ftp server. Anyone that wants to run the app needs the file installed or they won’t be able to run it. Now, I’m not sure if you will need a .mobileprovision file that has all of the device ID’s built into it if you’re not part of the enterprise program, but you can try and see. Once your files are all on the ftp server, you’ll need to create an email that has links to the two files, but the link for the .ipa file has to be in a special format. For the provisioning file:

ftp://ftp.company.com/Installers/profile.mobileprovision

and for the .ipa file:

itms-services:///?action=download-manifest&url=ftp%3A%2F%2Fftp.company.com%2FInstallers%2FmyApp.plist

Now when you send this email to someone, they just need to first download and install the .mobileprovision file, then the .ipa file. Voila, they are running your program. Let me know if this works without the enterprise subscription. I imagine it would as long as the .mobileprovision file contained the device ID’s.

Edit:

I’ve found a much better way of distributing apps, but it requires you to have a PHP server. What you do is create a PHP file that generates the plist file on the fly and returns that. In the links for large image, small image and ipa file you pass in links to other PHP files that return those things for your specific program. When you want to install an app from a link, you just pass in the url like this:

itms-services:///?action=download-manifest&url=http://mycompany.com/php/installApp.php?app=myappname

In your PHP functions you would just insert myappname into the other PHP calls, which would pull the proper files from your server. Using this method, you don’t need to store plist files for any of your apps as they are generated, which makes updating your apps easier since you don’t need to retype the information every time, don’t even check the checkbox for enterprise distribution, just save the ipa file over the old one and you’re good to go. Also, it is easy to implement security and login features with this method. Also, you don’t need to specifically install the mobile provision file, as it installs itself when you install the app. It is stored in the ipa file.

Edit:

Just to clarify the PHP method, you create a php file that creates plist files. Copy a standard plist file created from an enterprise distribution build, then in your php file, set the headers like this:

$pathToAddFi = "installers/".$_GET['app'].".plist"; //points to the php server file location of your .ipa files. when you call this php script, you pass in the name of the ipa file you want to install. Note: this location doesn't actually contain any plist files!
$root = "http://yourserver.com/php/root/"; //path to this PHP file's directory

header('content-type: application/xml');
header('Content-Disposition: attachment; filename=".basename($pathToAddFi));
header("Content-Transfer-Encoding: binary');

Then you build a string replacing the urls for your items like this:

<string>".$root."ipa_serve.php?app=". $_GET['app']."</string>

and end it with one last header before you echo the xml string:

header('Content-Length: ' . strlen($myXml));

Lastly, you create a php file to serve your ipa file, one to serve your large image, and one to serve your small image. Should be fairly straight forward unless you aren’t very familiar with PHP.

Leave a Comment