如果创建的是 “非消耗型” 的商品,苹果会要求程序必须包含 “恢复购买” 的功能
要不然审核会被拒绝,前几天就因为这个被拒审了
因为用的是AnySDK接的苹果支付,但是AnySDK只有支付 没有 “恢复购买” 的功能
所以自己实现了一个:用的是JS调用原生OC实现请求恢复购买,然后取到已经购买的非消耗商品ID,再把商品ID传回JS进行恢复处理
#上代码!!!
###这是在JS中开始调用OC的函数
// 恢复购买(调用OC静态函数)
restorePurchasesStart: function () {
try {
// 使用原生去查找已购买的商品,然后再传回JS:第一个参数 IAPHelper 是类名,第二个参数 restorePurchases 是OC的静态函数名
jsb.reflection.callStaticMethod("IAPHelper", "restorePurchases");
} catch (err) {
cc.log(err);
}
}
###这是在OC中获得商品ID后调用传回JS的方法
// 恢复购买(OC调用,传回商品ID列表)
restorePurchasesEnd: function (ids) {
try {
let productIds = ids.split(',');
productIds.forEach(function(id) {
// 在这里进行恢复处理
}, this);
} catch (err) {
cc.log(err);
}
}
###OC中成功获取到已购买的非消耗商品ID后调用js传回商品ID
// 恢复购买完成
- (void)paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) queue {
// 将商品ID用逗号分隔连接成字符串
NSString *ids = [productIds componentsJoinedByString:@","];
// 需要调用的JS函数:require('SDKHelpers').restorePurchasesEnd 是引用 SDKHelpers.js 文件里的 restorePurchasesEnd 函数 ('%@') 就是把商品ID当初参数传递过去
NSString *function = [NSString stringWithFormat: @"require('SDKHelpers').restorePurchasesEnd('%@')", ids];
// 转为C风格字符串
const char *stringFunc = [function UTF8String];
// outVal 是js函数的返回值,这里我们可以不管它
jsval *outVal;
// OC调用JS,传回商品ID
ScriptingCore::getInstance()->evalString(stringFunc, outVal);
}
需求用到的朋友稍微修改一下就可以用了,都是基于Cocos Creator的。
Tips:这里只是代码片段,具体代码请点击这里到github下载