注意: 本文生宛,只寫大體重要幾個步驟县昂,不是很詳細。
仔細研究建議觀看:
In-App Purchase for Developer陷舅、
巧哥的(iOS應(yīng)用內(nèi)付費(IAP)開發(fā)步驟列表 倒彰、
Yi'mouleng、
如何正確使用IAP
等等......
創(chuàng)建你的 SkpayManager
導(dǎo)入 StoreKit庫
簽訂<SKPaymentTransactionObserver, SKProductsRequestDelegate>
協(xié)議
SkpayManager:
1. 程序啟動添加SKPay觀察者蔑赘,同時像后端請求產(chǎn)品列表信息
- (void)launch {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[self requestProductList];
}
2. 程序結(jié)束后狸驳,移除SKpay觀察者
- (void)terminate {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
3. 這時候已請求拿到我們服務(wù)端給的產(chǎn)品信息,購買頁面可進行UI布局展示
4. 進入購買頁面预明,通過用戶選擇的產(chǎn)品ID,以及quantity進行購買
- (void)buyProductsWithId:(NSString *)productsId andQuantity:(NSInteger)quantity {
self.productsId = productsId;
self.quantity = quantity;
if ([SKPaymentQueue canMakePayments]) {
//允許程序內(nèi)付費購買
[self RequestProductData:@[self.productsId]];
} else {
[[ZToastManager ShardInstance] showtoast:@"您的手機沒有打開程序內(nèi)付費購買"];
}
}
5. 然后通過用戶選中的產(chǎn)品ID數(shù)組缩赛,SKProductsRequest 開始請求購買
- (void)RequestProductData:(NSArray *)productsIdArr {
//請求對應(yīng)的產(chǎn)品信息
NSSet *nsset = [NSSet setWithArray:productsIdArr];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;
[request start];
}
6. SKProductsRequestDelegate 會接收到請求響應(yīng)耙箍,在此回調(diào)中,發(fā)送購買請求
//收到的產(chǎn)品信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
//收到產(chǎn)品反饋信息
NSArray *myProduct = response.products;
// NSLog(@"產(chǎn)品Product ID:%@", response.invalidProductIdentifiers);
// NSLog(@"產(chǎn)品付費數(shù)量: %d", (int) [myProduct count]);
// populate UI
for (SKProduct *product in myProduct) {
// NSLog(@"product info");
// NSLog(@" 基本描述: %@", [product description]);
// NSLog(@" IAP的id: %@", product.productIdentifier);
// NSLog(@" 地區(qū)編碼: %@", product.priceLocale.localeIdentifier);
// NSLog(@" 本地價格: %@", product.price);
// NSLog(@" 語言代碼: %@", [product.priceLocale objectForKey:NSLocaleLanguageCode]);
// NSLog(@" 國家代碼: %@", [product.priceLocale objectForKey:NSLocaleCountryCode]);
// NSLog(@" 貨幣代碼: %@", [product.priceLocale objectForKey:NSLocaleCurrencyCode]);
// NSLog(@" 貨幣符號: %@", [product.priceLocale objectForKey:NSLocaleCurgegrencySymbol]);
// NSLog(@" 本地標(biāo)題: %@", product.localizedTitle);
// NSLog(@" 本地描述: %@", product.localizedDescription);
[self updateProductPriceWithId:product.productIdentifier andPrice:product.price];
if ([[product.priceLocale objectForKey:NSLocaleCurrencyCode] isEqualToString:@"CNY"]) {
self.CurrencyCode = @"¥";
} else {
self.CurrencyCode = [product.priceLocale objectForKey:NSLocaleCurrencySymbol];
}
}
//發(fā)送購買請求
for (SKProduct *prct in myProduct) {
if ([self.productsId isEqualToString:prct.productIdentifier]) {
SKMutablePayment *payment = nil;
payment = [SKMutablePayment paymentWithProduct:prct];
payment.quantity = self.quantity;
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
}
}
7. SKPaymentTransactionObserver 此協(xié)議會監(jiān)聽到購買結(jié)果,根據(jù)購買結(jié)果的不同酥馍,做出不同的邏輯辩昆。
#pragma mark - SKPaymentTransactionObserver
//----監(jiān)聽購買結(jié)果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
//交易結(jié)果
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased: {
//交易完成
[self completeTransaction:transaction];
}
break;
case SKPaymentTransactionStateFailed: {
//交易失敗
[self hideHud];
[self failedTransaction:transaction];
[[ZToastManager ShardInstance] showtoast:@"交易失敗"];
}
break;
case SKPaymentTransactionStateRestored: {
//已經(jīng)購買過該商品
[self hideHud];
[self restoreTransaction:transaction];
[[ZToastManager ShardInstance] showtoast:@"已經(jīng)購買過該商品"];
}
break;
case SKPaymentTransactionStatePurchasing: {
//商品添加進列表
NSLog(@"商品添加進列表");
}
break;
case SKPaymentTransactionStateDeferred: {
NSLog(@"SKPayment Transaction State Deferred");
}
break;
default:
break;
}
}
}
8. 購買成功之后,需將receipt 上傳至自己的服務(wù)端
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
// Your application should implement these two methods.
//NSString *product = transaction.payment.productIdentifier;
[self verifyReceipt:transaction];
}