diff --git a/Andromida.xcodeproj/project.pbxproj b/Andromida.xcodeproj/project.pbxproj index 5ad6319..6d4cc78 100644 --- a/Andromida.xcodeproj/project.pbxproj +++ b/Andromida.xcodeproj/project.pbxproj @@ -449,7 +449,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 6R7KLBPBLZ; + DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -561,8 +561,8 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; @@ -597,8 +597,8 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)"; + PRODUCT_NAME = "$(PRODUCT_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; @@ -621,7 +621,7 @@ GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 26.2; MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaTests; + PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; @@ -645,7 +645,7 @@ GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 26.2; MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaTests; + PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; @@ -667,7 +667,7 @@ DEVELOPMENT_TEAM = 6R7KLBPBLZ; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaUITests; + PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; @@ -689,7 +689,7 @@ DEVELOPMENT_TEAM = 6R7KLBPBLZ; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaUITests; + PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; @@ -722,7 +722,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida.AndromidaWidget; + PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -755,7 +755,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.1; - PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida.AndromidaWidget; + PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES; diff --git a/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme b/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme index 3cf4e0b..54a2e7e 100644 --- a/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme +++ b/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme @@ -16,7 +16,7 @@ @@ -45,7 +45,7 @@ @@ -62,7 +62,7 @@ diff --git a/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme b/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme index d761e6c..a912e3e 100644 --- a/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme +++ b/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme @@ -31,7 +31,7 @@ @@ -72,7 +72,7 @@ @@ -108,7 +108,7 @@ diff --git a/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist b/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist index 0d92d80..406d7fe 100644 --- a/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,6 +9,11 @@ orderHint 1 + AndromidaTests.xcscheme_^#shared#^_ + + orderHint + 3 + AndromidaWidgetExtension.xcscheme_^#shared#^_ orderHint diff --git a/Andromida/AndromidaApp.swift b/Andromida/AndromidaApp.swift index 64ca630..33d5c00 100644 --- a/Andromida/AndromidaApp.swift +++ b/Andromida/AndromidaApp.swift @@ -12,6 +12,7 @@ struct AndromidaApp: App { /// Track if user just completed the wizard (to start on Rituals tab) @State private var justCompletedWizard = false + @State private var isTransitioningToRoot = false init() { // Register app's color theme for Bedrock components @@ -55,14 +56,13 @@ struct AndromidaApp: App { if hasCompletedSetupWizard { // Main app - start on Rituals tab if just completed wizard - AppLaunchView(config: .rituals) { - RootView( - store: store, - settingsStore: settingsStore, - categoryStore: categoryStore, - initialTab: justCompletedWizard ? .rituals : .today - ) - } + RootView( + store: store, + settingsStore: settingsStore, + categoryStore: categoryStore, + initialTab: justCompletedWizard ? .rituals : .today + ) + .transition(.opacity) } else { // First-run setup wizard AppLaunchView(config: .rituals) { @@ -72,7 +72,7 @@ struct AndromidaApp: App { reminderScheduler: store.reminderScheduler, onComplete: { justCompletedWizard = true - withAnimation { + withAnimation(.easeInOut(duration: 0.5)) { hasCompletedSetupWizard = true } } diff --git a/Andromida/App/Views/RootView.swift b/Andromida/App/Views/RootView.swift index 56aadb3..3c225c4 100644 --- a/Andromida/App/Views/RootView.swift +++ b/Andromida/App/Views/RootView.swift @@ -9,7 +9,7 @@ struct RootView: View { @State private var selectedTab: RootTab @State private var analyticsPrewarmTask: Task? @State private var isForegroundRefreshing = false - @State private var isResumingFromBackground = true + @State private var isResumingFromBackground = false private let foregroundRefreshMinimumSeconds: TimeInterval = 0.15 private let debugForegroundRefreshMinimumSeconds: TimeInterval = 0.8 private let debugForegroundRefreshKey = "debugForegroundRefreshNextForeground" diff --git a/Andromida/Shared/Configuration/AppIdentifiers.swift b/Andromida/Shared/Configuration/AppIdentifiers.swift index 3b68e0e..051592b 100644 --- a/Andromida/Shared/Configuration/AppIdentifiers.swift +++ b/Andromida/Shared/Configuration/AppIdentifiers.swift @@ -17,7 +17,14 @@ enum AppIdentifiers { Bundle.main.bundleIdentifier ?? "com.mbrucedogs.Andromida" } + // User-facing app name + static let appName: String = { + Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String + ?? Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String + ?? "Rituals" + }() + static var widgetBundleIdentifier: String { - "\(bundleIdentifier).Widget" + "\(bundleIdentifier).AndromidaWidget" } } diff --git a/Andromida/Shared/Configuration/Base.xcconfig b/Andromida/Shared/Configuration/Base.xcconfig index 97e6070..48a76ce 100644 --- a/Andromida/Shared/Configuration/Base.xcconfig +++ b/Andromida/Shared/Configuration/Base.xcconfig @@ -6,20 +6,21 @@ // ============================================================================= COMPANY_IDENTIFIER = com.mbrucedogs -APP_NAME = Andromida -DEVELOPMENT_TEAM = // Add your Team ID here if needed +BUNDLE_ID_NAME = Andromida +PRODUCT_NAME = Rituals +DEVELOPMENT_TEAM = 6R7KLBPBLZ // ============================================================================= // DERIVED IDENTIFIERS - DO NOT EDIT // ============================================================================= -APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME) +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 +WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).AndromidaWidget INTENT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Intent -TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)Tests -UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)UITests +TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)Tests +UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)UITests -APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(APP_NAME) -CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(APP_NAME) +APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME) +CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME) diff --git a/AndromidaWidget/Info.plist b/AndromidaWidget/Info.plist index e6e0a7d..74a8d99 100644 --- a/AndromidaWidget/Info.plist +++ b/AndromidaWidget/Info.plist @@ -7,9 +7,9 @@ NSExtensionPointIdentifier com.apple.widgetkit-extension - AppGroupIdentifier - $(APP_GROUP_IDENTIFIER) CloudKitContainerIdentifier $(CLOUDKIT_CONTAINER_IDENTIFIER) + AppGroupIdentifier + $(APP_GROUP_IDENTIFIER)