From ab8ef49ddb64f98c131b5a55c9e8085da6fe4407 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Tue, 3 Feb 2026 08:51:24 -0600 Subject: [PATCH] Signed-off-by: Matt Bruce --- SelfieCam.xcodeproj/project.pbxproj | 34 ++++++++----- .../UserInterfaceState.xcuserstate | Bin 10960 -> 15298 bytes .../xcshareddata/xcschemes/SelfieCam.xcscheme | 10 ++-- SelfieCam/Configuration/AppIdentifiers.swift | 45 ++++++++++++++++++ SelfieCam/Configuration/Base.xcconfig | 18 +++++-- SelfieCam/SelfieCam.entitlements | 10 +++- 6 files changed, 95 insertions(+), 22 deletions(-) create mode 100644 SelfieCam/Configuration/AppIdentifiers.swift diff --git a/SelfieCam.xcodeproj/project.pbxproj b/SelfieCam.xcodeproj/project.pbxproj index a10abf5..58cb46b 100644 --- a/SelfieCam.xcodeproj/project.pbxproj +++ b/SelfieCam.xcodeproj/project.pbxproj @@ -32,8 +32,8 @@ /* Begin PBXFileReference section */ EA836ABF2F0ACE8A00077F87 /* SelfieCam.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SelfieCam.app; sourceTree = BUILT_PRODUCTS_DIR; }; - EA836ACC2F0ACE8B00077F87 /* SelfieCamTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelfieCamTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - EA836AD62F0ACE8B00077F87 /* SelfieCamUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelfieCamUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + EA836ACC2F0ACE8B00077F87 /* SelfieCam.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelfieCam.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + EA836AD62F0ACE8B00077F87 /* SelfieCam.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelfieCam.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; EACONFIG002 /* SelfieCam/Configuration/Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = SelfieCam/Configuration/Debug.xcconfig; sourceTree = SOURCE_ROOT; }; EACONFIG003 /* SelfieCam/Configuration/Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = SelfieCam/Configuration/Release.xcconfig; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ @@ -100,8 +100,8 @@ isa = PBXGroup; children = ( EA836ABF2F0ACE8A00077F87 /* SelfieCam.app */, - EA836ACC2F0ACE8B00077F87 /* SelfieCamTests.xctest */, - EA836AD62F0ACE8B00077F87 /* SelfieCamUITests.xctest */, + EA836ACC2F0ACE8B00077F87 /* SelfieCam.xctest */, + EA836AD62F0ACE8B00077F87 /* SelfieCam.xctest */, ); name = Products; sourceTree = ""; @@ -164,7 +164,7 @@ packageProductDependencies = ( ); productName = SelfieCamTests; - productReference = EA836ACC2F0ACE8B00077F87 /* SelfieCamTests.xctest */; + productReference = EA836ACC2F0ACE8B00077F87 /* SelfieCam.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; EA836AD52F0ACE8B00077F87 /* SelfieCamUITests */ = { @@ -187,7 +187,7 @@ packageProductDependencies = ( ); productName = SelfieCamUITests; - productReference = EA836AD62F0ACE8B00077F87 /* SelfieCamUITests.xctest */; + productReference = EA836AD62F0ACE8B00077F87 /* SelfieCam.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; /* End PBXNativeTarget section */ @@ -436,6 +436,11 @@ DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "$(PRODUCT_NAME)"; + INFOPLIST_KEY_PublicAppName = "$(PRODUCT_NAME)"; + INFOPLIST_KEY_AppGroupIdentifier = "$(APP_GROUP_IDENTIFIER)"; + INFOPLIST_KEY_CloudKitContainerIdentifier = "$(CLOUDKIT_CONTAINER_IDENTIFIER)"; + INFOPLIST_KEY_AppClipDomain = "$(APPCLIP_DOMAIN)"; INFOPLIST_KEY_NSCameraUsageDescription = "SelfieCam needs camera access to display your live selfie preview, apply real-time filters and ring light effects, capture high-quality photos, and enable advanced features like Center Stage auto-framing."; INFOPLIST_KEY_NSMicrophoneUsageDescription = "SelfieCam needs microphone access for the camera framework to initialize properly. Audio is not recorded."; INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SelfieCam needs photo library access to automatically save your captured photos to your device, making them available in the Photos app and other compatible applications."; @@ -451,7 +456,7 @@ ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; @@ -473,6 +478,11 @@ DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "$(PRODUCT_NAME)"; + INFOPLIST_KEY_PublicAppName = "$(PRODUCT_NAME)"; + INFOPLIST_KEY_AppGroupIdentifier = "$(APP_GROUP_IDENTIFIER)"; + INFOPLIST_KEY_CloudKitContainerIdentifier = "$(CLOUDKIT_CONTAINER_IDENTIFIER)"; + INFOPLIST_KEY_AppClipDomain = "$(APPCLIP_DOMAIN)"; INFOPLIST_KEY_NSCameraUsageDescription = "SelfieCam needs camera access to display your live selfie preview, apply real-time filters and ring light effects, capture high-quality photos, and enable advanced features like Center Stage auto-framing."; INFOPLIST_KEY_NSMicrophoneUsageDescription = "SelfieCam needs microphone access for the camera framework to initialize properly. Audio is not recorded."; INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SelfieCam needs photo library access to automatically save your captured photos to your device, making them available in the Photos app and other compatible applications."; @@ -488,7 +498,7 @@ ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; @@ -510,7 +520,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 26.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; @@ -532,7 +542,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 26.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; @@ -552,7 +562,7 @@ GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; @@ -572,7 +582,7 @@ GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; diff --git a/SelfieCam.xcodeproj/project.xcworkspace/xcuserdata/mattbruce.xcuserdatad/UserInterfaceState.xcuserstate b/SelfieCam.xcodeproj/project.xcworkspace/xcuserdata/mattbruce.xcuserdatad/UserInterfaceState.xcuserstate index 1f5e7330ae2809ce5b4a39fa4366112c7dea4ca3..031df7a04597f604f1c80079b15c2fe54b15da00 100644 GIT binary patch literal 15298 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 @@ -36,7 +36,7 @@ @@ -47,7 +47,7 @@ @@ -69,7 +69,7 @@ @@ -93,7 +93,7 @@ diff --git a/SelfieCam/Configuration/AppIdentifiers.swift b/SelfieCam/Configuration/AppIdentifiers.swift new file mode 100644 index 0000000..b1f82a1 --- /dev/null +++ b/SelfieCam/Configuration/AppIdentifiers.swift @@ -0,0 +1,45 @@ +import Foundation + +enum AppIdentifiers { + // Read from Info.plist (values come from xcconfig) + static let publicAppName: String = { + Bundle.main.object(forInfoDictionaryKey: "PublicAppName") as? String + ?? "SelfieCam" + }() + + static let appGroupIdentifier: String = { + Bundle.main.object(forInfoDictionaryKey: "AppGroupIdentifier") as? String + ?? "group.com.mbrucedogs.SelfieCam" + }() + + static let cloudKitContainerIdentifier: String = { + Bundle.main.object(forInfoDictionaryKey: "CloudKitContainerIdentifier") as? String + ?? "iCloud.com.mbrucedogs.SelfieCam" + }() + + static let appClipDomain: String = { + Bundle.main.object(forInfoDictionaryKey: "AppClipDomain") as? String + ?? "yourapp.example.com" + }() + + // Derived from bundle identifier + static var bundleIdentifier: String { + Bundle.main.bundleIdentifier ?? "com.mbrucedogs.SelfieCam" + } + + static var watchBundleIdentifier: String { + "\(bundleIdentifier).watchkitapp" + } + + static var appClipBundleIdentifier: String { + "\(bundleIdentifier).Clip" + } + + static var widgetBundleIdentifier: String { + "\(bundleIdentifier).Widget" + } + + static func appClipURL(recordName: String) -> URL? { + URL(string: "https://\(appClipDomain)/appclip?id=\(recordName)") + } +} diff --git a/SelfieCam/Configuration/Base.xcconfig b/SelfieCam/Configuration/Base.xcconfig index 2417a78..ec45ad0 100644 --- a/SelfieCam/Configuration/Base.xcconfig +++ b/SelfieCam/Configuration/Base.xcconfig @@ -6,13 +6,23 @@ // ============================================================================= COMPANY_IDENTIFIER = com.mbrucedogs -APP_NAME = SelfieCam +BUNDLE_ID_NAME = SelfieCam +PRODUCT_NAME = Selfie Cam DEVELOPMENT_TEAM = 6R7KLBPBLZ // ============================================================================= // DERIVED IDENTIFIERS - DO NOT EDIT // ============================================================================= -APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME) -TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)Tests -UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)UITests +APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME) +WATCH_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).watchkitapp +APPCLIP_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Clip +WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Widget +INTENT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Intent +TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)Tests +UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)UITests + +APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME) +CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME) + +APPCLIP_DOMAIN = yourapp.example.com diff --git a/SelfieCam/SelfieCam.entitlements b/SelfieCam/SelfieCam.entitlements index 1a1a421..17a212a 100644 --- a/SelfieCam/SelfieCam.entitlements +++ b/SelfieCam/SelfieCam.entitlements @@ -2,7 +2,15 @@ + com.apple.developer.icloud-container-identifiers + + $(CLOUDKIT_CONTAINER_IDENTIFIER) + com.apple.developer.ubiquity-kvstore-identifier - $(TeamIdentifierPrefix)$(CFBundleIdentifier) + $(TeamIdentifierPrefix)$(APP_BUNDLE_IDENTIFIER) + com.apple.security.application-groups + + $(APP_GROUP_IDENTIFIER) +