什么是内购?
内购就是指,在APP内购买某些产品
如果你在App中销售的商品,跟App功能有关(例如植物大战僵尸中的道具,需要开启关卡,拥有某种技能等等).那么,苹果规定,必须通过内购方式购买.
内购分成: 3 : 7
为什么做内购
- 开发者创收的一种模式: free + 内购
- 某些业务必须使用内购
如果销售的商品应该使用"苹果内购", 而没有使用, APP将不允许上架.
内购的产品类型
- 非消耗品(Nonconsumable)
买了就一直有,不会消耗,例如开启关卡
一般指的是在游戏中一次性购买并拥有永久访问权的物品或服务。非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用
- 消耗品(Consumable)
买了就用,用了就没
专为支持可消耗的物品或服务设计的,消耗品购买不可被再次下载,根据其特点,消耗品不能在用户的设备之间跨设备使用,除非自定义服务在用户的账号之间共享这些信息
- 其他类型
以下三种类别在iBooks中使用,目前iBooks不支持大陆市场
免费订阅(Free subscriptions)
自动续费订阅(Auto-renewing subscriptions)
非自动续费订阅(Nonrenewing subscriptions)
- 内购的流程 类似于商场购物流程, 参照下图
- 内购演练
1.在App管理中心,创建一个App,并填写App信息
注意: 此处创建的App时,填写套装ID,时,必须选择可以内购的套装ID
截屏2020-05-26下午4.50.52.png
截屏2020-05-26下午4.51.07.png
2.创建内购商品,并添加到App,指定此App,可以销售哪些商品
注意: 创建内购商品的前提,是你已经填写了税务/银行信息,否则的话,无法创建
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<String>) -> () 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<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;
}
}];
}
内购的测试
开始测试, 并添加用于测试内购的测试账号
测试账号必须是不存在的APP ID
-
进入用户和职能
用户和职能.png -
创建沙箱技术测试人员
创建沙河测试人员.png
恢复购买
deinit {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
@IBAction func retore(sender: AnyObject) {
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}
网友评论