Flint 内购集成完全指南如何用 PurchaseTracker 跟踪购买状态并解锁高级功能【免费下载链接】FlintThe Flint framework for building apps on Apple platforms using Feature Driven Development项目地址: https://gitcode.com/gh_mirrors/flint5/FlintFlint 是面向 Apple 平台的功能驱动开发Feature Driven Development框架而它的内购集成机制正是帮助开发者把付费墙变成声明式规则的核心能力通过PurchaseTracker跟踪购买状态再把功能Feature与产品Product绑定购买完成后高级功能自动解锁。本文带你从 0 到 1 看懂 Flint 的购买体系不写一行复杂代码也能建立完整认知 。一、Flint 内购体系全景三个角色协作在 Flint 中用户买了什么和功能开没开放是两件事中间由一个桥接层连接角色职责关键文件Product产品描述 App Store 中的内购项目一次性买断、订阅、积分等Product.swiftPurchaseRequirement购买要求声明满足哪些购买条件功能才可用支持任意 AND/OR 组合PurchaseRequirement.swiftPurchaseTracker购买跟踪器回答用户到底买没买并与 StoreKit 等真实支付系统对接PurchaseTracker.swift当购买状态发生变化时Flint 会自动重新评估所有依赖购买的功能并通知 UI 刷新——这就是购买后功能瞬间解锁的底层原理。PurchaseTracker 协议只需回答三个问题PurchaseTracker是整个内购体系的灵魂协议它的职责非常聚焦见 FlintCore/Purchases/PurchaseTracker.swiftisPurchased(_:)—— 某个非消耗型产品如买断解锁包买了吗isSubscriptionActive(_:)—— 某个订阅自动续订或不续订当前有效吗isFeatureEnabledByPastPurchases(_:)—— 是否因历史购买如老版本买断用户 grandfathering 而直接放行某功能值得注意的是前两个方法返回的是Bool?三态值true已购买 ✅false确认未购买 ❌nil尚不确定——比如票据还在服务端校验中 ⏳这种设计让 Flint 能优雅处理购买状态尚未确定的过渡期避免误开或误锁功能。二、定义你的产品Flint 提供的 5 种 Product 类型在 FlintCore/Purchases/ 目录下Flint 为不同商业模式准备了开箱即用的产品类型全部继承自Product基类通过productID与 App Store 中创建的内购项目一一对应类型适用场景文件NonConsumableProduct一次买断、永久解锁NonConsumableProduct.swiftConsumableProduct积分、道具等消耗品ConsumableProduct.swiftAutoRenewingSubscriptionProduct自动续订订阅月/年费AutoRenewingSubscriptionProduct.swiftNonRenewingSubscriptionProduct不自动续订的订阅NonRenewingSubscriptionProduct.swiftSubscriptionProduct订阅的公共基类SubscriptionProduct.swift提示Product采用 class 语义且字段开放你可以子类化它附加自定义属性如懒加载 App Store 的本地化价格方便构建自己的商店界面。三、PurchaseRequirement用 AND/OR 逻辑解锁高级功能这是 Flint 内购设计中最惊艳的部分购买要求不是简单的买 A 开 B而是一个可以任意嵌套的规则图见 FlintCore/Purchases/PurchaseRequirement.swift。每个要求由三要素组成products产品集合matchingCriteria.any买其中任意一个即可或.all必须全部购买dependencies对其他要求的依赖关系可无限嵌套由此可以表达几乎所有商业策略官方文档中列举的例子包括买了产品 A 即可用功能 X买 A、B、C 中的任意一个即可用必须同时购买 A B C基础订阅且产品 B或产品 C——比如订阅制 创始版买断组合解锁实战场景一位基础订阅用户同时购买了创始版终身解锁包只要订阅仍有效全部高级功能立即开放——这套规则用 Flint 声明几行就能搞定而传统做法往往要写一堆if-else。功能是否可用的最终判定由PurchasePreconditionEvaluator完成见 PurchasePreconditionEvaluator.swift它与权限、平台、用户开关等其他约束一起构成 Flint 的完整约束评估链。四、StoreKitPurchaseTracker最快接入 StoreKit 的官方实现Flint 内置了基于 StoreKit 的现成实现 StoreKitPurchaseTracker它的运行机制如下监听支付队列实现SKPaymentTransactionObserver监听SKPaymentQueue的交易更新记录购买结果交易进入.purchased/.restored购买成功/恢复购买时记录为已购.failed/.deferred时移除本地持久化通过 SimplePurchaseStore.swift 把购买状态以 JSON 存到.purchases.json并开启文件保护completeUntilFirstUserAuthentication支持 App Group初始化时传入appGroupIdentifier即可让主 App 与扩展共享购买状态。在 Flint 初始化quickSetup时如果没有手动指定框架会自动创建StoreKitPurchaseTracker作为默认实现见 Flint.swift 中的默认逻辑零配置即可工作✨。⚠️重要安全提醒官方注释明确说明StoreKitPurchaseTracker不验证收据receipt本地存储理论上可被越狱用户篡改。官方观点是依赖 Apple 平台安全即可但如果你售卖高价值内容建议自行实现PurchaseTracker协议加入服务端票据校验并避免出现单一校验点。五、开发期神器DebugPurchaseTracker 与 PurchaseBrowserFeature测试内购是最痛苦的环节之一Flint 提供了两个作弊工具1. 运行时覆盖购买状态DebugPurchaseTracker 可以单独使用开发构建中当作内存版假 tracker也可以代理真实 tracker让你随时把任意产品强制设为已购买 / 未购买 / 未知三种状态并立即通知所有观察者刷新 UI——无需真实走一遍支付流程。2. 可视化购买浏览器iOS 上引入 FlintUI 的 PurchaseBrowserFeature 后执行show动作即可弹出一个购买状态浏览界面直观展示当前所有功能声明的内购产品的购买情况配合DebugPurchaseTracker还能直接在界面上切换状态。3. 单元测试中的 Mock测试代码中的 MockPurchaseValidator.swift 演示了如何用makeFakePurchase(_:)/confirmNotPurchased(_:)伪造购买非常适合学习如何为自己的 App 编写内购相关测试。六、购买状态变化的连锁反应当PurchaseTracker内部状态改变时会调用PurchaseTrackerObserver.purchaseStatusDidChange(productID:isPurchased:)广播变更协议定义见 PurchaseTrackerObserver.swift。Flint 核心在初始化时已把自己注册为观察者于是触发如下链条交易成功 → PurchaseTracker 通知 → 约束重新评估 → 功能状态翻转 → UI 自动更新这正是功能驱动开发的魅力你的业务代码只声明功能 X 需要购买 A至于解锁后的界面、动作、日志如何联动框架自动处理。七、总结Flint 内购集成的最佳实践场景推荐做法简单买断/订阅解锁功能直接用默认的StoreKitPurchaseTracker复杂定价策略订阅买断组合用PurchaseRequirement的dependencies搭建规则图开发调试DebugPurchaseTrackerPurchaseBrowserFeature高价值内容自定义PurchaseTracker加入服务端票据校验老用户兼容实现isFeatureEnabledByPastPurchases(_:)做 grandfathering 放行掌握PurchaseTracker协议 PurchaseRequirement规则图这两块拼图你就能在 Flint 中构建出既灵活又可靠的付费解锁体系让高级功能在用户支付完成的瞬间优雅登场 。【免费下载链接】FlintThe Flint framework for building apps on Apple platforms using Feature Driven Development项目地址: https://gitcode.com/gh_mirrors/flint5/Flint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考