在iOS 4.2之后,updatedTransactions无法回调

时间:2011-11-03 13:54:56

标签: iphone ios ipad storekit

我们在商店套件方面遇到了棘手的问题。我们正在努力将应用内购买可再生订阅流程正确地实施到appStore上已经设置了标准应用内购买(非消费品)的应用中。

到目前为止,在花了两个月的沙盒奇怪行为后,我们在运行iOS4.2的测试iPad上找到了一个可行的解决方案。

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

我们将其缩小到这个简单的事实: - iOS4.2:updatedTransactions回调正常工作 - iOS4.3及更高版本:沙箱不会调用updatedTransactions回调。

关于为什么适用于iOS4.2的商店套件代码无法在以下iOS版本上运行的任何想法?我没有看到任何弃用的东西。

以下是我们更新的交易代码的代码:

- (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 个答案:

答案 0 :(得分:4)

我有完全相同的问题并解决它我切换了包含的源文件 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中,您可以在目标下执行此操作 - >构建阶段 - >编译来源。

更新:我对此行为的解释是ARC想要管理内存本身,但对Storekit来说效果不佳。 ARC过早发布'观察者'对象。当InAppPurchase模块(Apple端)想要建议你的“updatedTransactions”时,这会导致崩溃 方法。并且让我在应用程序的生命周期中将“观察者”对象卡在内存中。我决定在我的.h文件中保留属性。