iOS StoreKit - 何时调用 - (void)restoreCompletedTransactions?

标签 ios objective-c storekit

我的应用程序中有很多一次性购买 IAP。用户可以购买它们。

我的问题是我正在与 Flurry 集成以跟踪实际购买而不是仅仅恢复购买,但我的 SKPaymentTransactiontransactionState 总是返回为 SKPaymentTransactionStatePurchased 而不是 SKPaymentTransactionStateRestored

显然 SKPaymentTransactionStateRestored 仅在 - (void)restoreCompletedTransactions 时调用,但我什么时候调用此方法?

我的想法是,购买应该是这样的:1) 用户选择产品,2) 询问用户是否愿意购买 X 金额的产品。 3)服务器检查用户之前是否购买过,以及他们是否通过设置SKPaymentTransactionStateRestored恢复了它。否则,处理交易并设置 SKPaymentTransactionStatePurchased。显然这是错误的,我想在两者之间的某个地方调用 - (void)restoreCompletedTransactions???

谢谢,

最佳答案

编辑:

最初我发布了一个很长的、不需要的方法来完成我需要的事情,但正如您将在下面看到的,Matt 帮助我找出了我正在寻找的变量。

举个例子,假设一个用户之前购买了我的应用,购买了所有可用的非消耗性 IAP,然后删除了该应用。当用户重新安装应用时,我希望能够确定他们何时再次“购买”产品,是原始(首次)购买还是恢复购买?

我实现了“恢复所有购买”按钮,但假设用户忽略/没有看到它,并尝试选择他们之前购买的产品。

与正常购买一样,我执行以下操作:

if ([SKPaymentQueue canMakePayments])
{
      self.productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productID]];

      self.productRequest.delegate = self;
      [self.productRequest start];
}
else
{
     //error message here
}

在用户登录到他们的 iTunes 帐户后,该应用程序将让他们知道他们已经购买了这个并且现在将被恢复。将调用以下委托(delegate)方法:

 -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{   
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
            {
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                if(transaction.originalTransaction)
                {
                    NSLog(@"Just restoring the transaction");
                }
                else
                {
                    NSLog(@"First time transaction");
                }

                break;
            }
            default:
                break;
        }
    }
}

无论交易是恢复交易还是首次购买,transaction.transactionState 都将等于 SKPaymentTransactionStatePurchased

现在,我们如何确定该购买是原始购买还是修复购买?

简单:如上所见,只看transaction.originalTransaction是否被初始化。根据 Apple 的说明://仅当状态为 SKPaymentTransactionStateRestored 时才有效。

如果 SKPaymentTransactionoriginalTransaction 被初始化,这意味着之前有一个交易。否则,这笔交易是原始交易!

再次感谢 Matt 为我指明了正确的方向,并使逻辑更加清晰!

关于iOS StoreKit - 何时调用 - (void)restoreCompletedTransactions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084315/

相关文章:

ios - 如果用户在基于时间的 InApp 购买订阅中更改设备当前日期怎么办?

ios - 如果 UIGestureRecognizer 触发,如何取消按钮点击?

iphone - objective-c ARC 只读属性和私有(private) setter 实现

ios - 使用 Xcode 11 与 Xcode 10 编译时,NSData 描述和 NSString stringWithFormat 具有不同的返回结果

ios - 在 Swift 中迭代 JavaUtilList

ios - iOS 11 如何从 iOS Receipt 中获取 original_application_version(第一个购买的版本号)?

iOS IAP - 如何区分 "restoring done, but not purchased before"状态

iphone - 在 UIView 上滚动有图案的背景

iOS Google Maps SDK,无法收听 GMSMarker 点击事件

ios - 动态添加到 Localizable.strings