Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>

This commit is contained in:
Matt Bruce 2026-01-10 15:14:43 -06:00
parent c4221435b9
commit e673658516

View File

@ -604,6 +604,88 @@ FileManager.default.containerURL(
CKContainer(identifier: AppIdentifiers.cloudKitContainerIdentifier)
```
### Adding New Targets
When adding new targets (Widgets, Intents, App Clips, etc.), follow this pattern:
#### 1. Add Bundle ID Variable to Base.xcconfig
```
// In Base.xcconfig, add new derived identifier
WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Widget
INTENT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Intent
```
#### 2. Set Target to Use xcconfig
For the new target's Debug/Release configurations in `project.pbxproj`:
```
EA_NEW_TARGET_DEBUG /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = EACONFIG002 /* Debug.xcconfig */;
buildSettings = {
PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)";
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
// ... other settings
};
};
```
#### 3. Configure Entitlements (if needed)
If the target needs App Groups or CloudKit access, create an entitlements file using variables:
```xml
<!-- WidgetExtension.entitlements -->
<key>com.apple.security.application-groups</key>
<array>
<string>$(APP_GROUP_IDENTIFIER)</string>
</array>
```
#### 4. Share Code via App Groups
Extensions must use App Groups to share data with the main app:
```swift
// In extension code
let sharedDefaults = UserDefaults(suiteName: AppIdentifiers.appGroupIdentifier)
let containerURL = FileManager.default.containerURL(
forSecurityApplicationGroupIdentifier: AppIdentifiers.appGroupIdentifier
)
```
#### 5. Update AppIdentifiers.swift (if needed)
Add new computed properties for target-specific identifiers:
```swift
static var widgetBundleIdentifier: String { "\(bundleIdentifier).Widget" }
static var intentBundleIdentifier: String { "\(bundleIdentifier).Intent" }
```
#### Common Target Types and Bundle ID Patterns
| Target Type | Bundle ID Variable | Example Value |
|-------------|-------------------|---------------|
| Widget Extension | `WIDGET_BUNDLE_IDENTIFIER` | `$(APP_BUNDLE_IDENTIFIER).Widget` |
| Intent Extension | `INTENT_BUNDLE_IDENTIFIER` | `$(APP_BUNDLE_IDENTIFIER).Intent` |
| App Clip | `APPCLIP_BUNDLE_IDENTIFIER` | `$(APP_BUNDLE_IDENTIFIER).Clip` |
| Watch App | `WATCH_BUNDLE_IDENTIFIER` | `$(APP_BUNDLE_IDENTIFIER).watchkitapp` |
| Notification Extension | `NOTIFICATION_BUNDLE_IDENTIFIER` | `$(APP_BUNDLE_IDENTIFIER).NotificationExtension` |
| Share Extension | `SHARE_BUNDLE_IDENTIFIER` | `$(APP_BUNDLE_IDENTIFIER).ShareExtension` |
#### Checklist for New Targets
- [ ] Add bundle ID variable to `Base.xcconfig`
- [ ] Set `baseConfigurationReference` to Debug/Release xcconfig
- [ ] Use `$(VARIABLE)` for `PRODUCT_BUNDLE_IDENTIFIER`
- [ ] Use `$(DEVELOPMENT_TEAM)` for team
- [ ] Create entitlements with `$(APP_GROUP_IDENTIFIER)` if sharing data
- [ ] Add to `AppIdentifiers.swift` if Swift code needs the identifier
- [ ] Register App ID in Apple Developer Portal (uses same App Group)
### Migration
To migrate to a new developer account, edit **one file** (`Base.xcconfig`):
@ -613,7 +695,7 @@ COMPANY_IDENTIFIER = com.newcompany
DEVELOPMENT_TEAM = NEW_TEAM_ID
```
Then clean build (⇧⌘K) and rebuild. Everything updates automatically.
Then clean build (⇧⌘K) and rebuild. Everything updates automatically—including all extension targets.
## Dynamic Type Instructions