【干货分享】iOS内购恢复功能:恢复购买

如果创建的是 “非消耗型” 的商品,苹果会要求程序必须包含 “恢复购买” 的功能:cold_sweat:

要不然审核会被拒绝,前几天就因为这个被拒审了:sob:

因为用的是AnySDK接的苹果支付,但是AnySDK只有支付 没有 “恢复购买” 的功能:fearful:

所以自己实现了一个:用的是JS调用原生OC实现请求恢复购买,然后取到已经购买的非消耗商品ID,再把商品ID传回JS进行恢复处理:dizzy_face:

#上代码!!!

###这是在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下载

12赞

帮你编辑了一下,把 ` 改为 ``` 就可以了

原来如此,谢谢修正~

哥们你这代码可以成功吗?我写了个测试的调用不回去,找不到js方法,你知道是怎么回事吗?

下载github的代码,可以使用的。

哥,ScriptingCore::getInstance() 这句话会报错,完全复制的你的代码啊

怎么拿到订阅的时长以及到期时间呢