Get Bundle ID from a different target
The build settings of the targets are not available for the other targets. However the build settings of the PROJECT are available.
You can thus add a user-defined build setting in your project and call it PARENT_APP_BUNDLE_IDENTIFIER and set the correct bundle id for all your schemes.
Then in the info tab of the app extension target set the bundle id to
$(PARENT_APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME:rfc1034identifier)
It worked perfectly fine for me.
I have Siri extension and multiple targets, so to avoid duplicating extension for every target I added pre-action to every scheme that changes the BundleId of the extension's plist before build:
- Select 'Edit scheme'
- Click triangle near 'Build'
- Choose 'Pre-actions'
- Click '+', choose 'New Run Script Action'
- Choose target to provide build settings from
- In script field paste following with your BundleId and extension folder
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier
YourDesiredBundleId" "$PROJECT_DIR/YourExtensionFolder/Info.plist"
And it works like a charm! You need to configure it for every scheme.
In my project I need to build different versions of apps (differ in details, e.g. each application is branded with a different logo).
Let's say there is about 10 "app" targets, I can't imagine adding Notification Content and Notification Service extensions per each main target (in this case I would maintaining 30 targets in total - madness).
I run a script (https://gist.github.com/damian-rzeszot/0b23ad87e5ab5d52aa15c095cbf43c59) after "Embed App Extensions" phase. It overrides bundle id in app extension plists and re-signs the bundle.