【问题标题】:updatedTransactions failed to be called back after iOS 4.2iOS 4.2后updateTransactions回调失败
【发布时间】:2011-11-03 13:54:56
【问题描述】:

我们在商店套件方面遇到了一个棘手的问题。我们正在尝试将应用内购买可续订订阅流程正确实施到已在 appStore 上并设置了标准应用内购买(非消耗性产品)的应用中。

到目前为止,在与沙盒怪异行为作斗争 2 个月后,我们在运行 iOS4.2 的测试 iPad 上想出了一个可行的解决方案。

在 4.3 或 5.0 的 iPad 上测试此代码时,我们得到了令人讨厌的惊喜,它没有​​相同的行为。

我们将其范围缩小到这个简单的事实: - iOS4.2:updatedTransactions 回调正常工作 - iOS4.3 及以上:updatedTransactions 回调永远不会被沙箱调用。

关于为什么适用于 iOS4.2 的商店工具包代码在以下 iOS 版本上不起作用的任何想法?我没有看到任何弃用的内容。

这里是我们updatedTransactions的代码:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    NSLog(@"Add payment queue");
    for(SKPaymentTransaction *transaction in transactions)  {
        NSLog(@"Transaction state: %d, %d, %d, %d", transaction.transactionState, SKPaymentTransactionStatePurchased, SKPaymentTransactionStateFailed, SKPaymentTransactionStateRestored);
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:

                if([transaction.payment.productIdentifier isEqualToString:FM_PRODUCT_IDENTIFIER_SUBSCRIPTION]){
                    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
                    [userDefaults setObject:transaction.transactionReceipt forKey:@"TransactionReceiptOfTransaction"];
                }

                [self completeTransaction:transaction];
                [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

                break;

            case SKPaymentTransactionStateFailed:
                NSLog(@"%@", transaction.error);

                [self failedTransaction:transaction];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"") 
                                                                message:NSLocalizedString(@"Your subscription has expired.", @"")
                                                               delegate:self 
                                                      cancelButtonTitle:@"OK" 
                                                      otherButtonTitles: nil];
                [alert show];
                SAFE_RELEASE(alert);

                [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

                if([transaction.error code] != SKErrorPaymentCancelled) {
                    if([transaction.payment.productIdentifier isEqualToString:FM_PRODUCT_IDENTIFIER_SUBSCRIPTION]){
                        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
                        [userDefaults setObject:transaction.transactionReceipt forKey:@"TransactionReceiptOfTransaction"];
                    }
                }
                break;

            case SKPaymentTransactionStateRestored:

                if([transaction.payment.productIdentifier isEqualToString:FM_PRODUCT_IDENTIFIER_SUBSCRIPTION]){
                    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
                    [userDefaults setObject:transaction.transactionReceipt forKey:@"TransactionReceiptOfTransaction"];
                }

                [self restoreTransaction:transaction];
                [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

            default:
                    NSLog(@"Other");
                break;
        }
    }
}

谢谢, 斯蒂芬

【问题讨论】:

    标签: iphone ios ipad storekit


    【解决方案1】:

    我遇到了完全相同的问题,为了解决它,我切换了包含 addTransactionObserver 致电ARC = none

    //  StoreKit
    CustomStoreObserver *observer = [[CustomStoreObserver alloc] init];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
    

    似乎 ARC 或 StoreKit 框架不能很好地协同工作。 要使用 ARC = none 切换源文件,我设置了 -fno-objc-arc 标志,正如 Josh Caswell 在“禁用某些文件的自动引用计数”问题中所说的那样。

    答案是将 -fno-objc-arc 添加到您不需要 ARC 的文件的编译器标志中。在 Xcode 4 中,您可以在 target -> Build Phases -> Compile Sources 下执行此操作。

    更新:我对这种行为的解释是 ARC 想要自己管理内存,但它对 Storekit 做得不好。 ARC 过早地释放“观察者”对象。当 InAppPurchase 模块(Apple 方面)想要建议您的“updatedTransactions”时,这会导致崩溃 方法。对我来说,在我的应用程序生命周期中将“观察者”对象卡在内存中。我决定将属性保留在我的 .h 文件中。

    【讨论】:

    • 谢谢,我试试看!谢谢。
    猜你喜欢
    • 2014-08-20
    • 2013-09-16
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多