iOS内购掉单踩的坑

2019-12-03  本文已影响0人  小明2021

做内购的时候,遇到一个很棘手的掉单场景。

必先的一个丢掉场景:

当用户购买的时候,账号并未绑定银行卡/微信/支付宝的情况下,苹果会引导用户进行绑定,当用户绑定成功后,并购买成功,但是回到我们自己的APP里面,却没收到回调。导致掉单。(我试了两个不star比较多的内购第三方,都有这个问题)

分析发生上面问题的原因

发生上面情况的根本原因是:

苹果在发现用户未绑定银行卡/微信/支付宝的时候,返回了失败通知,当用户绑定完并支付完成后,又返回了成功的通知。
这时候就出问题了,正常的第三方封装block回调的逻辑是:收到结果回调后,就不再监听新的结果了。所以,导致后面支付完成的回调,就无法监听到了。。。。。导致掉单。

解决办法:

在 AppDelegate 里面添加: (内购的发起方法可以用第三方的,自己写内购监听的回调方法,避免上面的情况,监听不到。)

    /// 添加内购监听
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
// 自己添加内购监听,不销毁,保证一直能收到购买的回调。
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:
                // 请求自己后台的购买逻辑。
               
                break;
            case SKPaymentTransactionStateFailed:
                [self payError:transaction];
                break;
            case SKPaymentTransactionStateRestored:

            default:
                break;
        }
    }
}
}

需要注意的是:

// 意味着本地票据里面就删除了appStoreReceiptURL 里面就会去掉了。
// 苹果返回购买失败的时候调用。并且自己后台返回成功的时候调用。
    if ([SKPaymentQueue defaultQueue]) {
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }

对我帮助比较大的一个内购掉单文章:
https://www.jianshu.com/p/c4e24d4eebd9
非常感谢作者。

上一篇下一篇

猜你喜欢

热点阅读