內購和廣告
1. 什么是內購?
內購就是指,在APP內購買某些產品
如果你在App中銷售的商品,跟App有關(例如植物大戰僵尸中的道具,需要開啟關卡,擁有某種技能等等).那么,蘋果規定,必須通過內購方式購買.
內購分成: 3 : 7
2. 為什么做內購?
1. 開發者創收的一種模式: free + 內購
2. 某些業務必須使用內購
3. 內購的產品類型?
-
非消耗品(Nonconsumable)
買了就一直有,不會消耗,例如開啟關卡 一般指的是在游戲中一次性購買并擁有永久訪問權的物品或服務。非消耗品物品可以被用戶再次下載,并且能夠在用戶的所有設備上使用
-
消耗品(Consumable)
買了就用,用了就沒 專為支持可消耗的物品或服務設計的,消耗品購買不可被再次下載,根據其特點,消耗品不能在用戶的設備之間跨設備使用,除非自定義服務在用戶的賬號之間共享這些信息
-
其他類型
> 以下三種類別在iBooks中使用,目前iBooks不支持大陸市場 免費訂閱(Free subscriptions) 自動續費訂閱(Auto-renewing subscriptions) 非自動續費訂閱(Nonrenewing subscriptions)
-
內購的流程
類似于商場購物流程, 參照下圖
內購流程圖.png
-
內購實例
1. 在App管理中心,創建一個App,并填寫App信息 注意: 此處創建的App時,填寫套裝ID,時,必須選擇可以內購的套裝ID 2. 創建內購商品,并添加到App,指定此App,可以銷售哪些商品 注意: 創建內購商品的前提,是你已經填寫了稅務/銀行信息,否則的話,無法創建 3. 添加用于測試內購的測試賬號 4. 創建App項目,開始開發 5. 代碼實現內購流程 (1) 從APP服務器請求數據列表, 并行蘋果服務器請求可以銷售的商品列表
[XXXDataTool getGoodsWithResult:^(NSArray *goods) { NSArray *ids = [goods valueForKeyPath:@"goodID"]; // 請求哪些商品可以賣 NSSet *idSet = [NSSet setWithArray:ids]; SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:idSet]; request.delegate = self; [request start]; }];
(2) 在代理方法中獲取并顯示可銷售列表
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { self.products = response.products; }
(3) 用戶購買商品, 并監聽商品交易狀態
// 取出商品 SKProduct *product = self.products[indexPath.row]; // 購買商品 SKPayment *payMent = [SKPayment paymentWithProduct:product]; // 把憑證加入到隊列, 等待用戶付款 [[SKPaymentQueue defaultQueue] addPayment:payMent]; // 設置監聽者, 監聽整個交易狀態 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
(4) 實現監聽交易狀態方法
// 交易狀態發生變化時調用 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions { [transactions enumerateObjectsUsingBlock:^(SKPaymentTransaction * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { // SKPayment *payment , 小票 , 包含商品 // SKPaymentTransactionState transactionState 交易狀態 switch (obj.transactionState) { case SKPaymentTransactionStatePurchasing: NSLog(@"正在付款"); break; case SKPaymentTransactionStatePurchased: { NSLog(@"付款結束"); [queue finishTransaction:obj]; break; } case SKPaymentTransactionStateFailed: { NSLog(@"交易失敗"); [queue finishTransaction:obj]; break; } case SKPaymentTransactionStateRestored: NSLog(@"恢復購買"); break; case SKPaymentTransactionStateDeferred: NSLog(@"推遲付款"); break; default: break; } }]; }
<!--**具體步驟, 請參照步驟截圖詳解**-->