.苹果内购的相关功能已经上线2年多,苹果并未在此多有为难,最近日新增用户连续突破新高,内购收益也跟随水涨船高,突然在一个版本上被苹果审核拒绝。
其实主体思想就两个:1.用户在不提供手机号的情况下(也就是不登录)也可购买会员等内购相关内容。2.如果用户购买了可恢复购买项,在用户更换设备后,允许用户在新的设备上恢复自己的相关权益。
因为更新的这个版本是为适配iOS17上的问题,线上用户已反馈存在崩溃,时间紧急,所以给苹果回复了一个邮件对情况做了说明。
鉴于苹果一贯的审核原则,以为苹果并不会理会而保持拒绝,但是一天后出现了转机,苹果回复了表示理解的邮件,并先行将此版本进行通过审核(此前从未有过),并督促我方在后续的版本中添加上述两个功能。
其实大家都心知肚明,苹果虽然言语客气,但是下次提交审核,如果没有添加相关功能,肯定被拒。
以下正式开始解决方案:
1.游客内购:
其实所谓游客,只是没有手机号等相关认证信息,如果想购买权益,后端需要知道将权益交付给谁,总要有一个“人”才行
如果用户未登录购买时,获取用户设备UUID,并存储到KeyChain中,使用此UUID自动注册成为一个账户,并将权益下发至此。
因为KeyChain不与APP绑定,所以及时APP被删除后再次安装也不受影响。用户一旦被注册成功,后续流程与正常用户完全相同。
2.恢复购买:
****************************着重说明!可恢复购买项只有连续包月****************************
在会员购买的页面添加一个“恢复购买”的按钮,点击按钮后判断当前用户是否是登录状态,如果未登录,依然使用UUID自动注册一个用户
然后调用:[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 开始执行恢复购买流程
恢复购买成功后会进入回调:- (void)paymentQueue:(SKPaymentQueue*)queueupdatedTransactions:(NSArray*)transactions
如果回调值为:SKPaymentTransactionStateRestored 则恢复购买成功,可以直接按购买流程来添加权益即可。
注意:如果回调进入了SKPaymentTransactionStatePurchased,这是正常购买流程中的回调,此时要判断 transaction.originalTransaction 是否有值,如果有值,说明有原始订单id,则是恢复订阅,要走恢复购买流程,如果没有值,走正常购买流程。
注意代码中的这个看似毫无关系的宏:INTERESTED_LIST_NAME(自行理解,详情不表)
最后:以上方案的解决版本已成功通过审核并上线。