У нас возникла сложная проблема с магазинным комплектом. Мы пытаемся правильно внедрить процесс возобновляемых подписок на покупки в приложении в приложение, которое уже находится в магазине приложений со стандартной настройкой покупки в приложении (непотребляемые товары).
Пока что, потратив 2 месяца на борьбу со странным поведением в песочнице, мы создали рабочее решение для тестового iPad под iOS4.2.
Неприятный сюрприз, который мы получили при тестировании этого кода на iPad с 4.3 или 5.0, он не имеет такого поведения.
Мы сузили это до простого факта:
- iOS4.2: обновленный обратный вызов транзакций работает правильно
- iOS4.3 и выше: обновленный обратный вызов транзакций никогда не вызывается песочницей.
Есть идеи, почему код набора магазина, который работает на 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;
}
}
}
Спасибо,
Stephane