簡體   English   中英

iOS 4.2之后,無法調用updatedTransactions

[英]updatedTransactions failed to be called back after iOS 4.2

我們在使用存儲套件時遇到了一個棘手的問題。 我們正在嘗試將應用程序內購買可再生訂閱過程正確地實施到已設置了標准應用程序內購買(非消耗性產品)的appStore中的應用程序中。

到目前為止,在花了兩個月的時間解決沙盒怪異的行為之后,我們在運行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;
        }
    }
}

謝謝斯蒂芬

我遇到了完全相同的問題,為了解決該問題,我將包含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文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM