iOS蘋果內購流程(Apple Pay)
阿新 • • 發佈:2019-01-03
通過蘋果應用程式商店有三種主要賺錢的方式:
1.直接收費(我想天朝的大多數人是不會購買的)
2.廣告 iAd Framework
3.內購:應用程式本身的增值產品,(比如什麼歡樂豆之類的)
一般式37開, 蘋果3,開發商7
內購的產品分類:
1>非消耗品(Nonconsumable)一旦購買,終身擁有(終身會員)
2>消費品(Consumable),買了就用,用了就沒有了(歡樂豆)
剩下三種不常用:(中國用不上 iBooks)
3>免費訂閱
4>自動續費訂閱
5>非自動續費訂閱
內購流程, 蘋果官方說明:
Snip20151006_3.png
Snip20151006_4.png
新增StoreKit框架,進行內購流程的書寫:
#import "ViewController.h"
#import <StoreKit/StoreKit.h>
@interface ViewController () <SKProductsRequestDelegate, SKPaymentTransactionObserver>
/** 所有的產品 */
@property (nonatomic, strong) NSArray *products;
@end
@implementation ViewController
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// 通過觀察者監聽交易狀態
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
- (void)viewDidLoad {
[super viewDidLoad];
// 向蘋果伺服器請求可賣的商品
[self requestProducts];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"恢復" style:UIBarButtonItemStyleDone target:self action:@selector(restore)];
}
/**
* 請求可賣商品
*/
- (void)requestProducts
{
// 1.請求所有的商品
NSString *productFilePath = [[NSBundle mainBundle] pathForResource:@"iapdemo.plist" ofType:nil];
NSArray *products = [NSArray arrayWithContentsOfFile:productFilePath];
// 2.獲取所有的productid
NSArray *productIds = [products valueForKeyPath:@"productId"];
// 3.獲取productid的set(集合中)
NSSet *set = [NSSet setWithArray:productIds];
// 4.向蘋果傳送請求,請求可賣商品
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
request.delegate = self;
[request start];
}
/**
* 當請求到可賣商品的結果會執行該方法
*
* @param response response中儲存了可賣商品的結果
*/
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
/*
for (SKProduct *product in response.products) {
NSLog(@"價格:%@", product.price);
NSLog(@"標題:%@", product.localizedTitle);
NSLog(@"秒速:%@", product.localizedDescription);
NSLog(@"productid:%@", product.productIdentifier);
}
*/
// 1.儲存所有的資料
self.products = response.products;
self.products = [self.products sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(SKProduct *obj1, SKProduct *obj2) {
return [obj1.price compare:obj2.price];
}];
// 2.重新整理表格
[self.tableView reloadData];
}
#pragma mark - tableView的資料來源和代理方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.products.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *ID = @"ProductCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
// 1.取出模型
SKProduct *product = self.products[indexPath.row];
// 2.給cell設定資料
cell.textLabel.text = product.localizedTitle;
cell.detailTextLabel.text = [NSString stringWithFormat:@"價格:%@", product.price];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.取出模型
SKProduct *product = self.products[indexPath.row];
// 2.購買商品
[self buyProduct:product];
}
#pragma mark - 購買商品
- (void)buyProduct:(SKProduct *)product
{
// 1.建立票據
SKPayment *payment = [SKPayment paymentWithProduct:product];
// 2.將票據加入到交易佇列中
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
#pragma mark - 實現觀察者回調的方法
/**
* 當交易佇列中的交易狀態發生改變的時候會執行該方法
*
* @param transactions 陣列中存放了所有的交易
*/
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
/*
SKPaymentTransactionStatePurchasing, 正在購買
SKPaymentTransactionStatePurchased, 購買完成(銷燬交易)
SKPaymentTransactionStateFailed, 購買失敗(銷燬交易)
SKPaymentTransactionStateRestored, 恢復購買(銷燬交易)
SKPaymentTransactionStateDeferred 最終狀態未確定
*/
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
NSLog(@"使用者正在購買");
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"購買成功");
[queue finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
NSLog(@"購買失敗");
[queue finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"恢復購買");
[queue finishTransaction:transaction];
break;
case SKPaymentTransactionStateDeferred:
NSLog(@"最終狀態未確定");
break;
default:
break;
}
}
}
// 恢復購買
- (void)restore
{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
廣告: 蘋果自己搞的內容
1.新增iAd.framework
2.新增ADBannerView檢視,並設定代理方法
3.廣告條載入完成之前最好隱藏
-
(void)bannerViewDidLoadAd:(ADBannerView
*)banner {
self.bannerBottomConstraint.constant
= 20.0;
[UIView
animateWithDuration:0.5
animations:^{
[self.view
layoutIfNeeded];
}];
NSLog(@"載入廣告成功");
}
-
(void)bannerView:(ADBannerView
*)banner didFailToReceiveAdWithError:(NSError
*)error {
NSLog(@"載入廣告失敗
%@",
error);
}