首先你应该回去检讨In App Purchase的documentation,苹果提供的代码 - 他们勾勒出这详细了解它,并且了解他们正在做什么是有用的。
你缺少的是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];
嘿,这个答案今天保存了我的培根。确定它在苹果文档中,但我试图修复另一个开发人员编写的代码中的错误,并查看了这一点,我能够看到他错过了什么。谢谢! –