问题
I\'m trying to build my app with xcodebuild:
xcodebuild -workspace \"RG.xcworkspace\" -scheme \"Production\" -configuration \"Release\" build CONFIGURATION_BUILD_DIR=\"${TEMP_DIR}\" PROVISIONING_PROFILE=\"1234-5678-9098-7654-3210\"
My scheme has two targets. One target is the app, the other is the app extension (I built an extension for Safari). The app extension is a target dependency. Each target requires a separate provisioning profile. I don\'t know how to specify the PROVISIONING_PROFILE for the dependency. I\'m getting this error, as expected:
CodeSign error: code signing is required for product type \'App Extension\' in SDK \'iOS 8.1\'
StackOverflow and the man page for xcodebuild don\'t seem to come up with anything. Does anyone know how to build a project with xcodebuild that relies on two provisioning profiles?
回答1:
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

This will result in something like the following:

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 :)
回答2:
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
回答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 ipacom.company.experiments.AudioPlugin
is the extension bundle IDExperiments-AdHocProd_com.company.experiments.AudioPlugin.mobileprovision
is the extension profilecom.company.experiments
is the main app bundle identifierExperiments-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.
回答4:
In Swift, Pod files framework will be packaged separately. Following steps solved the problem.
1. Select pods
2. Targets
3. General
4. Edit bundle id
5. Build Settings
6. Code Signing
7. Provisioning profile -> select the valid profile
8. Code Signing Identity -> Select the respective identity from
profile.
Repeat the same for all targets.
I am able to generate build.
来源:https://stackoverflow.com/questions/27973011/xcodebuild-different-provisioning-profile-for-target-dependency