iOS 4.2后updateTransactions回调失败

Posted

技术标签:

【中文标题】iOS 4.2后updateTransactions回调失败【英文标题】:updatedTransactions failed to be called back after iOS 4.2 【发布时间】: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;
        
    

谢谢, 斯蒂芬

【问题讨论】:

【参考方案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 文件中。

【讨论】:

谢谢,我试试看!谢谢。

以上是关于iOS 4.2后updateTransactions回调失败的主要内容,如果未能解决你的问题,请参考以下文章

升级到 iOS 4.2 后应用程序启动时显示白屏

升级到 Xcode 4.2/iOS 5 后,类别中的方法引发异常

iOS 4.2 中的 NSUserDefault 问题

使用 SDK 4.2 开发的 iPhone 应用程序需要向后兼容 iOS 3.1.3 .. 简单的方法?

Xcode 4.2 iOS程序如何给按钮等添加点击后的代码

iOS5 模式登录不再在 XCode 4.2 中启动