From 7cb5bdfb40282e04031f3cdcbf4450e34a45170f Mon Sep 17 00:00:00 2001 From: Trey t Date: Tue, 10 Feb 2026 09:56:56 -0600 Subject: [PATCH] Update StoreKit config reference and use IAPManager singleton Re-add Configuration.storekit with updated project reference and use IAPManager.shared in FeelsApp to avoid creating a duplicate instance. Co-Authored-By: Claude Opus 4.6 --- Configuration.storekit | 177 ++++++++++++++++++++++++++++++++ Feels.xcodeproj/project.pbxproj | 8 +- Shared/FeelsApp.swift | 2 +- 3 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 Configuration.storekit diff --git a/Configuration.storekit b/Configuration.storekit new file mode 100644 index 0000000..dfac922 --- /dev/null +++ b/Configuration.storekit @@ -0,0 +1,177 @@ +{ + "appPolicies" : { + "eula" : "", + "policies" : [ + { + "locale" : "en_US", + "policyText" : "", + "policyURL" : "" + } + ] + }, + "identifier" : "E4A24A40", + "nonRenewingSubscriptions" : [ + + ], + "products" : [ + + ], + "settings" : { + "_applicationInternalID" : "6758580945", + "_askToBuyEnabled" : false, + "_billingGracePeriodEnabled" : false, + "_billingIssuesEnabled" : false, + "_developerTeamID" : "QND55P4443", + "_disableDialogs" : false, + "_failTransactionsEnabled" : false, + "_lastSynchronizedDate" : 792431418.15940905, + "_locale" : "en_US", + "_renewalBillingIssuesEnabled" : false, + "_storefront" : "USA", + "_storeKitErrors" : [ + + ], + "_timeRate" : 0 + }, + "subscriptionGroups" : [ + { + "id" : "21914363", + "localizations" : [ + + ], + "name" : "Feels Premium", + "subscriptions" : [ + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "0.99", + "familyShareable" : true, + "groupNumber" : 1, + "internalID" : "6758582054", + "introductoryOffer" : { + "internalID" : "DDFEB050", + "numberOfPeriods" : 1, + "paymentMode" : "free", + "subscriptionPeriod" : "P2W" + }, + "localizations" : [ + { + "description" : "Cobrança mensal", + "displayName" : "Mensal", + "locale" : "pt_BR" + }, + { + "description" : "毎月の請求", + "displayName" : "月額", + "locale" : "ja" + }, + { + "description" : "Facturation mensuelle", + "displayName" : "Mensuel", + "locale" : "fr" + }, + { + "description" : "Facturación mensual", + "displayName" : "Mensual", + "locale" : "es_ES" + }, + { + "description" : "Flexible month-to-month billing", + "displayName" : "Monthly", + "locale" : "en_US" + }, + { + "description" : "Monatliche Abrechnung", + "displayName" : "Monatlich", + "locale" : "de" + }, + { + "description" : "월간 결제", + "displayName" : "월간", + "locale" : "ko" + } + ], + "productID" : "com.88oakapps.feels.IAP.subscriptions.monthly", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "Monthly", + "subscriptionGroupID" : "21914363", + "type" : "RecurringSubscription", + "winbackOffers" : [ + + ] + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "9.99", + "familyShareable" : true, + "groupNumber" : 2, + "internalID" : "6758581068", + "introductoryOffer" : { + "internalID" : "6E5324DA", + "numberOfPeriods" : 1, + "paymentMode" : "free", + "subscriptionPeriod" : "P2W" + }, + "localizations" : [ + { + "description" : "Spare über 15%", + "displayName" : "Jährlich", + "locale" : "de" + }, + { + "description" : "Economize 15%", + "displayName" : "Anual", + "locale" : "pt_BR" + }, + { + "description" : "Best value — save over 15%", + "displayName" : "Yearly", + "locale" : "en_US" + }, + { + "description" : "15%以上お得", + "displayName" : "年額", + "locale" : "ja" + }, + { + "description" : "Mejor precio — ahorra 15%", + "displayName" : "Anual", + "locale" : "es_ES" + }, + { + "description" : "Économisez 15%", + "displayName" : "Annuel", + "locale" : "fr" + }, + { + "description" : "15% 이상 절약", + "displayName" : "연간", + "locale" : "ko" + } + ], + "productID" : "com.88oakapps.feels.IAP.subscriptions.yearly", + "recurringSubscriptionPeriod" : "P1Y", + "referenceName" : "Yearly", + "subscriptionGroupID" : "21914363", + "type" : "RecurringSubscription", + "winbackOffers" : [ + + ] + } + ] + } + ], + "version" : { + "major" : 4, + "minor" : 0 + } +} diff --git a/Feels.xcodeproj/project.pbxproj b/Feels.xcodeproj/project.pbxproj index 83ef0fc..58ae3a4 100644 --- a/Feels.xcodeproj/project.pbxproj +++ b/Feels.xcodeproj/project.pbxproj @@ -20,6 +20,8 @@ 1CD90B56278C7E7A001C4FEA /* FeelsWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 1CD90B45278C7E7A001C4FEA /* FeelsWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 1CD90B6C278C7F78001C4FEA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B6B278C7F78001C4FEA /* CloudKit.framework */; }; 1CD90B6E278C7F8B001C4FEA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B6B278C7F78001C4FEA /* CloudKit.framework */; }; + 1CDEFBBF2F3B8736006AE6A1 /* Configuration.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */; }; + 1CDEFBC02F3B8736006AE6A1 /* Configuration.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */; }; 46F07FA9D330456697C9AC29 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B47278C7E7A001C4FEA /* WidgetKit.framework */; }; /* End PBXBuildFile section */ @@ -63,7 +65,6 @@ /* Begin PBXFileReference section */ 1C0DAB50279DB0FB003B1F21 /* Feels/Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Feels/Localizable.xcstrings; sourceTree = ""; }; - 1CB4D09E28787B3C00902A56 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = ""; }; 1CB4D09F28787D8A00902A56 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.5.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; }; 1CD90AF5278C7DE0001C4FEA /* Feels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Feels.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1CD90AFB278C7DE0001C4FEA /* Feels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Feels.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -83,6 +84,7 @@ 1CD90B6D278C7F89001C4FEA /* FeelsWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = FeelsWidgetExtension.entitlements; sourceTree = ""; }; 1CD90B6F278C8000001C4FEA /* FeelsWidgetExtensionDev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = FeelsWidgetExtensionDev.entitlements; sourceTree = ""; }; 1CD90B70278C8000001C4FEA /* Feels (iOS)Dev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Feels (iOS)Dev.entitlements"; sourceTree = ""; }; + 1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = ""; }; 1E594AEAB5F046E3B3ED7C47 /* Feels Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Feels Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; B60015D02A064FF582E232FD /* Feels Watch App/Feels Watch AppDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch AppDebug.entitlements"; sourceTree = ""; }; B8AB4CD73C2B4DC89C6FE84D /* Feels Watch App/Feels Watch App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch App.entitlements"; sourceTree = ""; }; @@ -198,8 +200,8 @@ children = ( B8AB4CD73C2B4DC89C6FE84D /* Feels Watch App/Feels Watch App.entitlements */, B60015D02A064FF582E232FD /* Feels Watch App/Feels Watch AppDebug.entitlements */, - 1CB4D09E28787B3C00902A56 /* Configuration.storekit */, 1C0DAB50279DB0FB003B1F21 /* Feels/Localizable.xcstrings */, + 1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */, 1CD90B6A278C7F75001C4FEA /* Feels (iOS).entitlements */, 1CD90B70278C8000001C4FEA /* Feels (iOS)Dev.entitlements */, 1CD90B6D278C7F89001C4FEA /* FeelsWidgetExtension.entitlements */, @@ -468,6 +470,7 @@ buildActionMask = 2147483647; files = ( 1C0DAB51279DB0FB003B1F21 /* Feels/Localizable.xcstrings in Resources */, + 1CDEFBBF2F3B8736006AE6A1 /* Configuration.storekit in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -496,6 +499,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1CDEFBC02F3B8736006AE6A1 /* Configuration.storekit in Resources */, 1C0DAB52279DB0FB003B1F22 /* Feels/Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Shared/FeelsApp.swift b/Shared/FeelsApp.swift index 4079a0d..8f82203 100644 --- a/Shared/FeelsApp.swift +++ b/Shared/FeelsApp.swift @@ -16,7 +16,7 @@ struct FeelsApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate let dataController = DataController.shared - @StateObject var iapManager = IAPManager() + @StateObject var iapManager = IAPManager.shared @StateObject var authManager = BiometricAuthManager() @StateObject var healthKitManager = HealthKitManager.shared @AppStorage(UserDefaultsStore.Keys.firstLaunchDate.rawValue, store: GroupUserDefaults.groupDefaults) private var firstLaunchDate = Date()