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回调失败的主要内容,如果未能解决你的问题,请参考以下文章
升级到 Xcode 4.2/iOS 5 后,类别中的方法引发异常