Ad Hoc distribution of an iPhone application

Posted on Sun 17 May 2009

We're preparing a big new release at Goojet, and wanted to collect some feedback from some of our users. For iPhone applications, Apple allows "ad-hoc" installation of an application on up to 100 devices, without going through the AppStore and its painful validation process.

Reading the documentation, this sounds easy: just create an ad-hoc provisioning profile where all test devices are listed, sign your application with this profile and off you go. Alas, there is a tiny but absolutely mandatory step that isn't described in the docs, and I banged my head for hours before finally finding it...

iTunes refused to install the ad-hoc application, saying that it cannot be verified. Inspecting the iPhone's log shows "entitlement 'get-task-allow' has value not permitted by provisioning profile". This entitlement thing is mentioned only once in the whole documentation, in a place totally unrelated to ad-hoc installation and it barely explains what it is useful for.

So, here is what you have to do: in XCode, select File/New, and then in the "Code Signing" section you'll find an "Entitlements" template. Create an "Entitlements.plist" file, open it and uncheck the "get-task-allow" property. In the project's ad-hoc build configuration (that you should have created to sign with the ad-hoc profile), set the "Code Signing Entitlements" to "Entitlements.plist" you just created.

Build your application, done, you can deploy!

What is this property useful for? Apparently, unchecking it states that the application cannot be debugged. But why is it needed, and why in hell isn't this taken care of automatically when using an ad-hoc provisioning profile?

Some additional tricks for a nice packaging for your testers: use a different application ID and change the bundle ID in Info.plist accordingly, so that the new application can be installed besides the regular one instead or replacing it. Also set a different name and icon so that both version can be easily distinguished on the device.

And for a step-by-step explanation for your testers, checkout these nice how-to's: Finding your iPhone's unique identifier, and Installing an ad-hoc distributionn.

Kids grow fast... my son is 18 today

Quote of the day