0e1754fea0b11c1bba42b2b490043894
WWDC20 10659 - 介绍 Xcode 中的 StoreKit 测试

Introducing StoreKit Testing in Xcode

本文食用指南:本文并非是教读者如何创建 IAP 档位,如何调用 StoreKit 相关 API,应付苹果审核,而是着重于介绍苹果在这次的 WWDC2020 中对于以往 IAP 相关开发与测试中的痛点,做出了哪些改进。食用本文的读者应该拥有一定的 IAP 开发经验。并站在在笔者自己的角度,对这些改进作出基于笔者自身经验的评价,例如对于个人开发者或者是大公司开发者有多大的价值等。

  • Sandbox 环境终于可以享受跟正式环境一样的手动取消自动订阅,不用新建沙盒测试账号就能重新体验首购优惠,退款,升降级等操作了。
    • 开发者福音,苹果爸爸还是爱我们的,这个真的是极大节约了开发自动续费时的开发以及测试成本。
  • 苹果做了一个 StoreKitTest 的库,方便自动化测试。
    • 象征意义大于现实意义,在本人的工作经历下,深感自动化测试在目前国内的推进还是十分困难的。测试开发基本都是应用于接口测试。
  • 现在在本地测试的时候,可以本地自建一个沙盒购买环境(StoreKit configuration)
    • 对于个人独立开发者来说,有客户端校验订单的小型 APP,能节省相当一部分的成本;
    • 对大型 App 开发者来说,需要一定的适配成本,大公司的订单都是放在服务器校验的,且都是专职人员负责维护一个 SDK,需要外部团队配套的改动(服务器的验证)还是有一定工作量的。


正文开始

本地沙盒购买环境(StoreKit Configuration File)

回顾之前的 IAP 开发体验

  1. 登陆 AppStore Connect,新建 APP
  2. 创建对应的 IAP 档位,看苹果服务器心情,大致在 2 小时之后就能在沙盒环境中访问到对应 ProductId 的商品
  3. 创建沙盒账号
  4. 如果苹果沙盒服务器给面子,一切顺利的话,可以开始测试。笔者是经常遇到沙盒环境的登陆不上去,以及根本连不上沙盒环境,希望苹果的沙盒可以更稳定一点 ...
  5. 带 APP 版本 提审 IAP 档位,期待苹果审核爸爸不要给 2.1 大礼包 或者 3.1.2 相关拒审,并且在 包过审并且档位过审 后放出版本。笔者在两家公司都遇到过 App 过审但是内购 IAP 没有过的情况:)

现在的改进

可以本地创建一个 StoreKit Configuration File, 这样可以在本地直接控制沙盒环境,新建商品,包括首开优惠,自动续费控制下次扣款,取消订阅,控制家长监控购买(Ask to Buy)等等,功能还是十分完善的,可以说是 AppStore Connect 有的,StoreKit Configuration File 基本都能满足你。(除了没有非续期订阅这种类型)

操作步骤

1. 创建模版文件,完成之后选中新创建的空文件

创建模版文件

创建模版文件

选中空文件
选中空文件

2. 创建对应类型的商品,点击左下角的 + 号就能出现三个选项。

创建对应类型的商品

创建对应类型的商品

这里的三种 IAP 类型在下面贴上新版 AppStore Connect 的介绍,应该足够对应了。当前缺少非续期订阅的类型,苹果没有说为什么只缺了这一种,可能觉得没啥必要吧 ...
关于四种 IAP 商品的介绍
关于四种 IAP 商品的介绍

3. 消耗型项目的创建
  • ProductId 由于目前 AppStore Connect 的特性,每创建一个都是唯一的,哪怕你删掉了,都是不能再用的,所以就算创建错了,也不要删掉。不过本地的 StoreKit Configuration File 并没有这个限制。并且推荐使用语义化的创建方式,建议不要用纯数字或者随机生成的 ID,不然可读性不是很好。
  • 目前苹果似乎还没出各个国家不同的定价,输入的 Price 单位都是美刀(不过这个在开发的时候确实不重要),只要确保最后在 AppStore Connect 上创建的都是对的就行了。创建错了也没事,可以改,提审前建议多人交叉检查一遍,因为如果审核通过之后的改价很麻烦 ... 麻烦到我推荐你直接新创建一个再审一次 ...
    消耗型项目的创建
    消耗型项目的创建

    在非消耗型项目的选项里还有一个 Family Sharing 的选项,一笔带过了。
4. 自动续期订阅型项目的创建
  • 需要创建一个 GroupId,这个跟在 AppStore Connect 上是一致的,因为同一个 Group 内的商品是可以升降级的。关于升降级 等操作就不在这里展开了。简单来说就是有三个等级,1-2-3,是下图的 1,可以通过拖动右侧的 2 按钮来调整,我的截图是全都是 1,这样处理起来逻辑简单一点:)
    Appstore Connect 上的升降级操作页面
    Appstore Connect 上的升降级操作页面

    本地的操作
    本地的操作
  • 首开优惠 (Introductory Offer) 的类型很全,AppStore Connect 有什么,它就有什么,感受到了苹果爸爸的温暖。图中我是选了一个免费试用 7 天的首开优惠,这个优惠比较常见。
  • 促销优惠(Promotional Offers)的功能也很完善,虽然我没有用过。
    自动续期订阅型项目的创建
    自动续期订阅型项目的创建
5. 应用 StoreKit 文件

在 Edit Scheme 中切换到 Options Tab,再在 StoreKit Configuration 中选中你创建的 StoreKit 文件即可。
应用 StoreKit 文件

应用 StoreKit 文件

已选中
已选中

6. 本地管理订单状态

可以删除历史订单,删除首开优惠,可以退款等操作。还是十分方便的。
本地管理订单状态

本地管理订单状态

  • 退款操作,在选中了某一笔订单之后,直接点击退款按钮即可实现。注意这里苹果给了一个新的 API 去响应。
    退款 Refund
    退款 Refund
  • Ask to Buy,在选中 .storekit 文件之后,Editor 中就会出现选项,开启即可。然后购买之后就会展示 Ask to Buy 弹窗,订单状态是 Pending to Approval,可以在 Xcode 中进行操作,允许或者不允许。
    开启 Ask to Buy
    开启 Ask to Buy

    Ask To Buy 弹窗
    Ask To Buy 弹窗

    下图的 2 是 approve 按钮,3 是 deny 按钮。
    Approve or deny
    Approve or deny
  • Other 功能,包括缩短时间(Time Rate,自动续费很舒服),允许被中断的购买(Enable Interruted Purchases)等,都可以满足特定的自测需求。
    Editor 中提供的其他功能分
    Editor 中提供的其他功能分

本地的订单校验

这里需要注意的是,订单的校验方式会有所不同。虽然走的是苹果的非对称加密,但是是另一张证书,所以验证订单的时候需要使用 PKCS7_NOCHAIN 这个参数去标明。如果不在本地验证,则需要 对应的服务器逻辑也进行响应更改

top Created with Sketch.