What's new with in-app purchase
App Store & Distribution 进阶 20m

内购新特性

What's new with in-app purchase

2022年6月6日

在 Apple 官方观看视频

一句话判断

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 签名的工作量,但开发者仍然可以自行验证
WWDC 2022