iOS内购 IAP 实践

所属分类:ios | 发布于 2025-01-14

两年就给App加了IAP内购功能,现在新App要加内购,发现之前的知识几乎忘光了,现在重新整理记录下来。

iOS内购的基本知识请看这篇:iOS app内购IAP(In-App Purchase)开发预备知识

1、关于用哪种IAP类型的思考

  1. 之前做的app有用户系统,有后台,所以创建的是非续期订阅,非续期订阅由app自己来控制到期时间。
  2. 现在的app是单机版的,没有联网,4种IAP类型只有自动续期订阅是由Apple来管理到期时间的。Apple主推的自动续期订阅对苹果、对开发者的收入增长都有好处,但是唯独对用户感觉不好,特别是对国内的用户。自动扣费在国内还有很长的道路要走,这是信任与诚信的问题,不在此展开。
  3. 经过思考,最终决定1个月、3个月、6个月、12个月的订阅采用自动续期订阅,终身版采用非续期订阅。这样,自动续期的订阅由苹果来记录,app只需要查询是否有非续期的订阅,如果有,就是终身订阅。想法看起来很完成,这样即减少了令人讨厌的自动续期订阅,又不需要客户端来管理订阅到期时间,具体行不行的通等做完后再给结论。
  4. 最终实践:内购已开发完毕,最终结论是这样的,StoreKit2提供了三个API,不管哪种IAP类型,客户端都能自己完成购买校验,只不过要自己编写逻辑。终身版采用非消耗型商品;连续包月、连续包年采用自动续期订阅;1个月、3个月、6个月、12个月才用非自动续期订阅(感觉这里也可以使用非消耗型商品)。

2、创建订阅

2.1 创建订阅项须知

  1. 创建自动续期订阅需要先创建自动续期订阅群组,群组名称可以更改。
  2. 创建订阅项需要参考名称和产品ID,产品ID是给开发者看的,可以更改。产品ID一单创建,则不能更改,而且就算删除了订阅,此产品ID也不能再使用。

2.2 创建订阅项注意事项

主要是元数据丢失问题

元数据丢失情况一:审核信息里的截屏和审核备注最好一次填好,可以随便找个截屏,随便写点备注,后面stokekit配置文件同时时需要。

元数据丢失问题二:订阅列表里面的本地化语言至少要写一个,不然会始终显示元数据丢失。

3、Xcode创建Storekit配置文件

创建Storekit配置文件,可以让我们更方便的进行开发者测试,Storekit文件可以让开发者无需在Appstore connect创建app以及内购商品而进行本地测试开发。

3.1、在Xcode的模板的过滤器中搜索storekit,选中后点击创建

3.2、文件名随意,勾选从App Store Connect自动同步,勾选后,会自动列出Team和App,选择当前的App。

3.3、下一步选择保存为主,注意要勾上对应的Target

3.4、双击打开storekit配置文件,点击左下角的刷新按钮,Xcode会自动同步App Store Connect上的配置项

这里如果点同步后没反应,一般都是元数据丢失造成,详情参考上面2.2的内容,检查确保每个订阅项都是”Ready to Submit“准备提交,而不是”Missing Metadata“元数据丢失。

4、获取商品及购买流程

这个见本文最后的链接,感觉他们写的比较详细了。

5、交易管理

开发者遇到最大的问题就是如何判断用户是否已经购买,所以这里单独列出来。

StoreKit2提供了三个新的交易API:

All transactions:全部的购买交易订单;

Lastest transactions:最新的购买交易订单;

Current entitlements:所有当前订阅的交易,每种类型的交易只会列出最新的一笔,以及所有购买(且未退还)的非消耗品。

extension Transaction {
  public static var all: Transaction.Transactions { get }
  public static var currentEntitlements: Transaction.Transactions { get }
  public static func currentEntitlement(for productID: String) async -> VerificationResult<Transaction>?
  public static func latest(for productID: String) async -> VerificationResult<Transaction>?
  public static var unfinished: Transaction.Transactions { get }
}

恢复购买API,StoreKit2提供了sync() 方法来替代StoreKit 1里面的回复购买API,调用该方法后,系统会弹出提示框:

extension AppStore {
  public static func sync() async throws
}

唤起订阅管理页面API:

extension AppStore {

  @available(iOS 15.0, *)
  @available(macOS, unavailable)
  @available(watchOS, unavailable)
  @available(tvOS, unavailable)
  public static func showManageSubscriptions(in scene: UIWindowScene) async throws
}

6、参考列表

  1. iOS In-App Subscription Tutorial with StoreKit 2 and Swift
  2. iOS StoreKit 2 新特性解析

 

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接