Сначала вы должны вернуться и просмотреть документацию о покупке в приложении , которую предоставляет Apple - они подробно обрисовывают это, и полезно понимать, что делается на их стороне.
Что вам не хватает, так это SKPaymentTransactionObserver - вы несете ответственность за реализацию этого наблюдателя, которого вы добавляете в качестве наблюдателя SKPaymentTransactionQueue. Apple рекомендует добавить наблюдателя при запуске приложения в очередь по умолчанию, чтобы он мог отслеживать все транзакции, которые происходят во время работы приложения.
По сути, вам необходимо написать собственный класс, который реализует протокол SKPaymentTransactionObserver. Этот класс отслеживает обратные вызовы из очереди платежей, когда магазин iTunes обрабатывает платеж, и позволяет вам отслеживать события успеха и неудачи.
Вот скелет для наблюдателя платежей:
PaymentObserver.h
#import <StoreKit/StoreKit.h>
@interface PaymentObserver : NSObject <SKPaymentTransactionObserver> {
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
- (void) restoreTransaction: (SKPaymentTransaction *)transaction;
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
@end
PaymentObserver.m
#import "PaymentObserver.h"
@implementation PaymentObserver
- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
// handle payment cancellation
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
// handle the payment transaction actions for each state
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
{
// Record the transaction
//...
// Do whatever you need to do to provide the service/subscription purchased
//...
// Remove the transaction from the payment queue.
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
// Record the transaction
//...
// Do whatever you need to do to provide the service/subscription purchased
//...
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) failedTransaction: (SKPaymentTransaction *)transaction
{
if (transaction.error.code != SKErrorPaymentCancelled)
{
// Optionally, display an error here.
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
@end
После того, как вы внедрили PaymentObserver, вам нужно добавить экземпляр из него в очередь платежей по умолчанию в качестве наблюдателя транзакции.
// Done at app launch...
PaymentObserver *paymentObserver = [[PaymentObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:paymentObserver];