您的位置:首页 > 移动开发 > IOS开发

IAP - 3

2015-12-30 20:14 561 查看
SKPaymentQueue

支付队列:



默认队列:

+ (instancetype)defaultQueue NS_AVAILABLE_IOS(3_0);


添加支付项:

- (void)addPayment:(SKPayment *)payment NS_AVAILABLE_IOS(3_0);


还有一个相关性很强的协议:

@protocol SKPaymentTransactionObserver <NSObject>


其中用得很多的一个回调方法:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions NS_AVAILABLE_IOS(3_0);


更新支付队列的订单状态,后面会讲到,但要先添加观察者,不然不会调用相关的方法:

- (void)addTransactionObserver:(id <SKPaymentTransactionObserver>)observer NS_AVAILABLE_IOS(3_0);
例如:

[[SKPaymentQueue defaultQueue] addTransactionObserver:[InAppRageIAPHelper sharedHelper]];


还有一个完成交易的方法:这个方法更多的是对交易的操作,一旦结束操作,就必须调用这个方法来表示结束操作

- (void)finishTransaction:(SKPaymentTransaction *)transaction NS_AVAILABLE_IOS(3_0);


这里可能讲得有点乱,拿些例子会更好,支付队列委托的实现:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
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)recordTransaction:(SKPaymentTransaction *)transaction
{
// Optional: Record the transaction on the server side...
}

- (void)provideContent:(NSString *)productIdentifier
{
NSLog(@"Toggling flag for: %@", productIdentifier);
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:productIdentifier];
[[NSUserDefaults standardUserDefaults] synchronize];
[_purchasedProducts addObject:productIdentifier];

[[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];

}

- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
NSLog(@"completeTransaction...");

[self recordTransaction: transaction];
[self provideContent: transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction
{
NSLog(@"restoreTransaction...");

[self recordTransaction: transaction];
[self provideContent: transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

- (void)failedTransaction:(SKPaymentTransaction *)transaction
{
if (transaction.error.code != SKErrorPaymentCancelled)
{
NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
}

[[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchaseFailedNotification object:transaction];

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}


最后一个类:

SKPaymentTransaction

这个类不难,结合上面的使用非常容易理解:

typedef NS_ENUM(NSInteger, SKPaymentTransactionState) {
SKPaymentTransactionStatePurchasing,    // Transaction is being added to the server queue.
SKPaymentTransactionStatePurchased,     // Transaction is in queue, user has been charged.  Client should complete the transaction.
SKPaymentTransactionStateFailed,        // Transaction was cancelled or failed before being added to the server queue.
SKPaymentTransactionStateRestored,      // Transaction was restored from user's purchase history.  Client should complete the transaction.
SKPaymentTransactionStateDeferred NS_ENUM_AVAILABLE_IOS(8_0),   // The transaction is in the queue, but its final status is pending external action.
} NS_AVAILABLE_IOS(3_0);


这几个状态也非常好认识:购买中,购买完毕,购买失败,被存储的状态,被遗弃的状态

非常全面的一个解析:
http://southking.iteye.com/blog/1583039
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS IAP