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 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-10 09:56:56 -06:00
parent 1e8acfa320
commit 7cb5bdfb40
3 changed files with 184 additions and 3 deletions

177
Configuration.storekit Normal file
View File

@@ -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
}
}

View File

@@ -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 = "<group>"; };
1CB4D09E28787B3C00902A56 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = "<group>"; };
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 = "<group>"; };
1CD90B6F278C8000001C4FEA /* FeelsWidgetExtensionDev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = FeelsWidgetExtensionDev.entitlements; sourceTree = "<group>"; };
1CD90B70278C8000001C4FEA /* Feels (iOS)Dev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Feels (iOS)Dev.entitlements"; sourceTree = "<group>"; };
1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = "<group>"; };
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 = "<group>"; };
B8AB4CD73C2B4DC89C6FE84D /* Feels Watch App/Feels Watch App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch App.entitlements"; sourceTree = "<group>"; };
@@ -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;

View File

@@ -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()