我们在商店套件方面遇到了棘手的问题。我们正在努力将应用内购买可再生订阅流程正确地实施到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;
}
}
}
谢谢, 斯蒂芬
答案 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文件中保留属性。