diff --git a/Agents.md b/Agents.md index 3cfb43f..722fd16 100644 --- a/Agents.md +++ b/Agents.md @@ -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 + +com.apple.security.application-groups + + $(APP_GROUP_IDENTIFIER) + +``` + +#### 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