内购新特性
What's new with in-app purchase
2022年6月6日
一句话判断
StoreKit 2 在今年迎来了 App Transaction API(替代 App Receipt)、SwiftUI 原生兑换码和评价 API、StoreKit Messages 等一系列增强,做内购的开发者必看。
这场 Session 讲了什么
Session 以 Food Truck(甜甜圈外卖 App)为贯穿案例,介绍了 StoreKit 今年的多项更新。
核心新增是 App Transaction API,用于验证 App 本身的购买记录(取代旧的 App Receipt 中的 app detail 部分)。它用 JWS 签名,StoreKit 自动验证,支持手动刷新。典型使用场景:App 从付费转为免费+内购模式时,用 originalAppVersion 判断老用户是否应该继续享受高级功能。
其他更新包括:StoreKit 模型新增多个属性、SwiftUI 友好的订阅优惠码兑换和评价请求 API、StoreKit Messages(在 App 内展示 App Store 消息)、以及 Application Username 从旧版 StoreKit 迁移到新版 API 时的保留机制。
值得深挖的点
App Receipt 的拆分。 旧的 App Receipt 把 App 购买数据和内购历史混在一起。现在明确分成两部分:Transaction History(内购历史)和 App Transaction(App 购买信息)。这种拆分让数据职责更清晰。
付费转免费模式下的老用户处理。 这是很多开发者会遇到的问题。Food Truck 从 $4.99 付费 App 转为免费+内购模式,通过 AppTransaction.shared 获取 originalAppVersion,判断用户是否在转型前购买,从而决定是否解锁高级功能。代码实现非常直接。
StoreKit Messages 的应用场景。 App Store 可以向你的 App 推送消息(如价格同意更新),StoreKit Messages API 让你在 App 内展示这些消息。这解决了之前用户可能忽略邮件通知的问题——在 App 内直接弹出,转化率高得多。
代码片段
// 使用 App Transaction 验证 App 购买记录
import StoreKit
func checkAppPurchase() async {
let result = await AppTransaction.shared
switch result {
case .unverified:
// 验证失败,提示用户刷新
// 可以调用 result.refresh() 触发重新验证
break
case .verified(let appTransaction):
// 检查用户是否在 App 转免费前购买
let version8 = "8.0"
if appTransaction.originalAppVersion < version8 {
// 老用户,解锁所有高级功能
unlockPremiumContent()
} else {
// 新用户,需要通过内购解锁
break
}
}
}
// SwiftUI 中请求 App 评价
import StoreKit
Button("评价我们的 App") {
// SwiftUI 原生 API,替代旧的 SKStoreReviewController
AppStore.requestReview(in: appStore)
}
最佳实践
- 从付费转免费时,尽早集成 App Transaction。 不要等用户投诉才发现老用户的高级功能被锁了。
- App Transaction 刷新只在用户主动操作时触发。 它需要用户认证,不要在后台自动调用。
- 善用 StoreKit Messages 展示 App Store 通知。 特别是订阅价格变更等需要用户同意的场景,App 内展示比邮件通知有效得多。
- 迁移 Application Username 时使用新的保留机制。 如果你从旧版 StoreKit API 迁移到 StoreKit 2,确保
applicationUsername不会丢失。
还有什么值得关注
- 服务端也有对应更新:App Store Server API 增强、App Store Server Notifications V2 改进,Ian 在 Session 后半段有详细讲解
- Transaction History API 可以在设备端直接查询用户完整的内购历史,不一定要走服务端
- StoreKit 2 的自动验证机制减少了手动验证 JWS 签名的工作量,但开发者仍然可以自行验证