xcodebuild different provisioning profile for target dependency

I spent far too long working on this today. I was on my way to bed when the answer hit me:

In each of your targets's Build Settings you should set a $VARIABLE for the profile name. To do this, selected "Other" from the bottom of the list of profiles. Doing this will open a text field - choose a different $VARIABLE for each target - for example I chose $APP_PROFILE for the container app target and $EXTENSION_PROFILE for my Today extension target

Adding a build variable variable...

This will result in something like the following:

Profiles

Finally, when building with xcodebuild, specify the profile UUIDs as you did with PROVISIONING_PROFILE:

xcodebuild ... APP_PROFILE="85b6f019-d5e5-43a7-9e8f-e3aaed64a7e4" EXTENSION_PROFILE="e50cf605-ab63-40ad-8329-2758359ea748"

Building from within XCode seems to be unaffected - as far as I could tell XCode is selecting the default profiles (as if in "Automatic" mode)

Theoretically this would support multiple extensions too.

Works for me with XCode 6.3 :)


Months later... Found a solution that doesn't involve settings values within Xcode: Within sigh there is a script that is capable of resigning an ipa file with given profiles. The following works for me:

bash resign.sh Experiments-AdHocProd.ipa "iPhone Distribution: Company Pty Ltd" output.ipa -p com.company.experiments.AudioPlugin=Experiments-AdHocProd_com.company.experiments.AudioPlugin.mobileprovision -p com.company.experiments=Experiments-AdHocProd.mobileprovision --verbose

where:

  • Experiments-AdHocProd.ipa is the existing ipa
  • com.company.experiments.AudioPlugin is the extension bundle ID
  • Experiments-AdHocProd_com.company.experiments.AudioPlugin.mobileprovision is the extension profile
  • com.company.experiments is the main app bundle identifier
  • Experiments-AdHocProd.mobileprovision is the main app profile

Each profile's bundle identifier must match that of the app it will be signed with.

Something I found that is important to note is that if a bundle identifier has a wildcard (in my case Experiments-AdHocProd.mobileprovision does) then the profiles with explicit IDs must be passed into -p first.


Alternatively, you could use sigh to perform the resign. Unfortunately, sigh --help doesn't say anything about resigning binaries with extensions, however sigh resign --help does.


Solution Without Variable

There is an option, -exportSigningIdentity which can help you, because provisioning profiles of Application & Extension/Widget may be different, but signing identities of app & extension are supposed to be same.

For example, you will see that,

  • TargetApp -> Build Settings -> "Code Signing Identity (id)" (Release)
  • TargetExtension -> Build Settings -> "Code Signing Identity (id)" (Release)

are essentially same string, lets say this identity is "Code Signing Identity (id)". So to build & export archive, what you can run, are simply,

Cleaning

xcodebuild clean -workspace HelloWorld.xcworkspace -scheme HelloWorld

Building

xcodebuild -workspace HelloWorld.xcworkspace -scheme HelloWorld archive -archivePath ~/output/HelloWorld.xcarchive

Exporting

xcodebuild -exportArchive -exportFormat ipa -archivePath ~/output/HelloWorld.xcarchive -exportPath "HelloWorld.ipa" -exportSigningIdentity "Code Signing Identity (id)"

Reference: xcodebuild documentation