Q: How I can detect when this event (currently subscribed) has occurred so that I can process the transaction and grant access to my app.
Вы определяете, когда подписка существует, путем проверки с помощью Apple (для этого я использую код веб-сайта php), вы получаете ответ «код состояния» и можете проверить, является ли это кодом 21006 (срок действия подписки истек), или другие (я считаю что-либо кроме 0 и 21006 фактической ошибкой).
То, как я делаю, я храню детали транзакции в файле PLIST, который я храню в каталоге документов.
Вы можете добавить дополнительные поля в PLIST, такие как expiryDates, логические флаги и т. Д.
Таким образом, у вас есть копия квитанции, хотя вы всегда должны проверять ее, потому что срок ее действия истек.
Q: В платежеQueue: updatedTransactions: метод наблюдателя это
приходит как SKPaymentTransactionStateFailed. Как я
различать этот тип отказа и других отказов, таких как
пользователь нажимает кнопки отмены?
Вы используете оператор switch в методе updatedTransactions для определения различных типов ответов.
Пример
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
NSString *message = [NSString stringWithFormat:@"Transaction failed with error - %@", error.localizedDescription];
NSLog(@"Error - %@", message);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"updatedTransactions");
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchasing:
// take action whilst processing payment
break;
case SKPaymentTransactionStatePurchased:
// take action when feature is purchased
break;
case SKPaymentTransactionStateRestored:
// take action to restore the app as if it was purchased
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code != SKErrorPaymentCancelled)
{
// Do something with the error
} // end if
break;
default:
break;
} // end switch
} // next
TransactionStateFailed обрабатывает сбои, хотя я не пишу код для отмены, поскольку у меня нет причин делать это в моем приложении.
В: Я отправляю возвращенную транзакцию или мне нужно позвонить
restorePreviousTransactions.
Я полагаю, что StoreKit обрабатывает это внутренне с помощью метода finishTransaction и restorePreviousTransaction
т
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
для завершения транзакций
Надеюсь, это поможет