1. 程式人生 > >iOS蘋果內購流程(Apple Pay)

iOS蘋果內購流程(Apple Pay)

通過蘋果應用程式商店有三種主要賺錢的方式:

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);

}