美文网首页
iOS内购掉单踩的坑

iOS内购掉单踩的坑

作者: 小明2021 | 来源:发表于2019-12-03 17:16 被阅读0次

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

    必先的一个丢掉场景:

    当用户购买的时候,账号并未绑定银行卡/微信/支付宝的情况下,苹果会引导用户进行绑定,当用户绑定成功后,并购买成功,但是回到我们自己的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
    非常感谢作者。

    相关文章

      网友评论

          本文标题:iOS内购掉单踩的坑

          本文链接:https://www.haomeiwen.com/subject/hpxhgctx.html