内购和广告
1. 什么是内购?
内购就是指,在APP内购买某些产品
如果你在App中销售的商品,跟App有关(例如植物大战僵尸中的道具,需要开启关卡,拥有某种技能等等).那么,苹果规定,必须通过内购方式购买.
内购分成: 3 : 7
2. 为什么做内购?
1. 开发者创收的一种模式: free + 内购
2. 某些业务必须使用内购
3. 内购的产品类型?
-
非消耗品(Nonconsumable)
买了就一直有,不会消耗,例如开启关卡 一般指的是在游戏中一次性购买并拥有永久访问权的物品或服务。非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用
-
消耗品(Consumable)
买了就用,用了就没 专为支持可消耗的物品或服务设计的,消耗品购买不可被再次下载,根据其特点,消耗品不能在用户的设备之间跨设备使用,除非自定义服务在用户的账号之间共享这些信息
-
其他类型
> 以下三种类别在iBooks中使用,目前iBooks不支持大陆市场 免费订阅(Free subscriptions) 自动续费订阅(Auto-renewing subscriptions) 非自动续费订阅(Nonrenewing subscriptions)
-
内购的流程
类似于商场购物流程, 参照下图
-
内购实例
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; } }]; }
<!--**具体步骤, 请参照步骤截图详解**-->