# StoreKitHelper **Repository Path**: mirrors_jaywcjlove/StoreKitHelper ## Basic Information - **Project Name**: StoreKitHelper - **Description**: A lightweight StoreKit2 wrapper designed specifically for SwiftUI, making it easier to implement in-app purchases. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-16 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
使用 我的应用 也是一种 支持 我的方式:
VidCrop Vidwall Mousio Hint Mousio Musicer Audioer FileSentinel FocusCursor Videoer KeyClicker DayBar Iconed RightMenu Master Quick RSS Quick RSS Web Serve Copybook Generator DevTutor for SwiftUI RegexMate Time Passage Iconize Folder Textsound Saver Create Custom Symbols DevHub Resume Revise Palette Genius Symbol Scribe

StoreKit Helper === [English](./README.zh.md) 专为 SwiftUI 设计的轻量级 StoreKit2 包装器,让应用内购买的实现更加简单。 ![StoreKit Helper](https://github.com/user-attachments/assets/d0d27552-9d2d-4a09-8d8d-b96b3b3648a9) ## 文档 请参阅 [DevTutor](https://github.com/jaywcjlove/devtutor) 中详细的 `StoreKitHelper` [文档](https://github.com/jaywcjlove/devtutor),其中包括多个快速入门示例、自定义支付界面示例和 API 参考,提供全面的示例和指导。 ## 使用方法 在 SwiftUI 应用程序的入口点创建并注入一个 `StoreContext` 实例,它负责加载产品列表和跟踪购买状态。 ```swift import StoreKitHelper enum AppProduct: String, InAppProduct { case lifetime = "focuscursor.lifetime" case monthly = "focuscursor.monthly" var id: String { rawValue } } @main struct DevTutorApp: App { @StateObject var store = StoreContext(products: AppProduct.allCases) var body: some Scene { WindowGroup { ContentView().environmentObject(store) } } } ``` 使用 `StoreKitHelperView` 直接显示应用内购买弹窗视图,并通过链式 API 配置各种参数。 ```swift struct PurchaseContent: View { @EnvironmentObject var store: StoreContext var body: some View { StoreKitHelperView() .frame(maxWidth: 300) .frame(minWidth: 260) // 弹窗被关闭时触发(例如用户点击关闭按钮) .onPopupDismiss { store.isShowingPurchasePopup = false } // 设置在购买界面中显示的内容区域 // (可包含功能描述、版本对比等) .pricingContent { AnyView(PricingContent()) } .termsOfService { // 点击【服务条款】按钮时触发的操作 } .privacyPolicy { // 点击【隐私政策】按钮时触发的操作 } } } ``` 点击打开付费产品列表界面。 ```swift struct PurchaseButton: View { @EnvironmentObject var store: StoreContext var body: some View { if store.hasNotPurchased == true { PurchasePopupButton() .sheet(isPresented: $store.isShowingPurchasePopup) { /// 包含付费产品列表的弹窗 PurchaseContent() } } } } ``` 您可以使用 `StoreContext` 中的 `hasNotPurchased` 属性来检查用户是否已购买,然后动态显示不同的界面内容。例如: ```swift @EnvironmentObject var store: StoreContext var body: some View { if store.hasNotPurchased == true { // 🧾 用户未购买 - 显示受限内容或提示购买 } else { // ✅ 用户已购买 - 显示完整功能 } } ``` ### filteredProducts 这是一个简单的迁移解决方案:产品列表通过产品 ID 进行过滤,保留旧的产品 ID,这样现有用户不需要重新购买并可以恢复他们的购买,而新用户通过新的产品 ID 购买,实现平滑过渡。 ```swift enum AppProduct: String, InAppProduct { /// 旧版本 case sponsor = "focuscursor.Sponsor" case generous = "focuscursor.Generous" /// 新版本 case monthly = "focuscursor.monthly" case lifetime = "focuscursor.lifetime" var id: String { rawValue } } StoreKitHelperView() .filteredProducts() { productID, product in if productID == AppProduct.sponsor.rawValue { return false } if productID == AppProduct.generous.rawValue { return false } return true } StoreKitHelperSelectionView() .filteredProducts() { productID, product in return true } ``` ## 许可证 基于 MIT 许可证授权。