什么是内购?

内购就是指,在APP内购买某些产品

如果你在App中销售的商品,跟App功能有关(例如植物大战僵尸中的道具,需要开启关卡,拥有某种技能等等).那么,苹果规定,必须通过内购方式购买.

内购分成: 3 : 7

为什么做内购

开发者创收的一种模式: free + 内购某些业务必须使用内购

如果销售的商品应该使用"苹果内购", 而没有使用, APP将不允许上架.

内购的产品类型

非消耗品(Nonconsumable)

买了就一直有,不会消耗,例如开启关卡

一般指的是在游戏中一次性购买并拥有永久访问权的物品或服务。非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用

消耗品(Consumable)

买了就用,用了就没

专为支持可消耗的物品或服务设计的,消耗品购买不可被再次下载,根据其特点,消耗品不能在用户的设备之间跨设备使用,除非自定义服务在用户的账号之间共享这些信息

其他类型

以下三种类别在iBooks中使用,目前iBooks不支持大陆市场

免费订阅(Free subscriptions)

自动续费订阅(Auto-renewing subscriptions)

非自动续费订阅(Nonrenewing subscriptions)

内购的流程 类似于商场购物流程, 参照下图

image.png

内购演练

1.在App管理中心,创建一个App,并填写App信息

注意: 此处创建的App时,填写套装ID,时,必须选择可以内购的套装ID

截屏2020-05-26下午4.48.59.png

截屏2020-05-26下午4.50.52.png

截屏2020-05-26下午4.51.07.png

2.创建内购商品,并添加到App,指定此App,可以销售哪些商品

注意: 创建内购商品的前提,是你已经填写了税务/银行信息,否则的话,无法创建

填写商品信息

截屏2020-05-26下午4.55.35.png

3.添加用于测试内购的测试账号

4.创建App项目,开始开发

5.代码实现内购流程

(1) 从APP服务器请求数据列表, 并行苹果服务器请求可以销售的商品列表 商品1Id 商品2id

// 请求哪些商品可以卖

NSSet *idSet = [NSSet setWithArray:ids];

SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:idSet];

request.delegate = self;

[request start];

// swfit:

// 1. 从我们自己的服务器, 获取需要销售的额商品

DataTool.getGoodsList { (ids: Set) -> () in

// 2. 拿到需要销售的额商品, 到苹果服务器, 进行验证, 看下, 哪些商品, 才可以真正被销售

// 2.1 创建一个商品请求, 请求哪些商品可以真正的呗销售

let request: SKProductsRequest = SKProductsRequest(productIdentifiers: ids)

// 2.1.1 设置代理, 接收可以被销售的商品列表数据

request.delegate = self

// 2.2 发送请求

request.start()

}

(2) 在代理方法中获取并显示可销售列表

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

{

self.products = response.products;

}

swift

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "product")

// 获取对应的商品数据模型, 进行赋值

let product = products[indexPath.row]

// SKProduct 系统提供的商品模型

// product.localizedTitle 商品名称

// product.localizedDescription 商品描述

// product.price 商品价格

cell?.textLabel?.text = product.localizedTitle

cell?.detailTextLabel?.text = product.localizedDescription + "\(product.price)"

return cell!

}

(3) 用户购买商品, 并监听商品交易状态

// 取出商品

SKProduct *product = self.products[indexPath.row];

// 购买商品

SKPayment *payMent = [SKPayment paymentWithProduct:product];

// 把凭证加入到队列, 等待用户付款

[[SKPaymentQueue defaultQueue] addPayment:payMent];

// 设置监听者, 监听整个交易状态

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

// 1. 取出需要购买的商品

let product = products[indexPath.row]

// 2.0 p判断当前的支付环境, 是否可以支付

if SKPaymentQueue.canMakePayments() {

// 2. 购买商品

// 2.1 根据商品, 开一个支付小票

let payment = SKPayment(product: product)

// 2.2 添加到支付队列, 开始进行购买操作

SKPaymentQueue.defaultQueue().addPayment(payment)

// 2.3 添加交易队列的监听者, 来监听交易状态

SKPaymentQueue.defaultQueue().addTransactionObserver(self)

}

(4) 实现监听交易状态方法

// 交易状态发生变化时调用

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)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;

}

}];

}

内购的测试

开始测试, 并添加用于测试内购的测试账号

测试账号必须是不存在的APP ID

进入用户和职能

用户和职能.png

创建沙箱技术测试人员

创建沙河测试人员.png

恢复购买

deinit {

SKPaymentQueue.defaultQueue().removeTransactionObserver(self)

}

@IBAction func retore(sender: AnyObject) {

SKPaymentQueue.defaultQueue().restoreCompletedTransactions()

SKPaymentQueue.defaultQueue().addTransactionObserver(self)

}

Copyright © 2088 飚骑盟主竞技场 - 竞速游戏活动中枢 All Rights Reserved.
友情链接