美文网首页
IOS 内购

IOS 内购

作者: 越天高 | 来源:发表于2020-05-27 09:41 被阅读0次

    什么是内购?

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

    为什么做内购

    1. 开发者创收的一种模式: free + 内购
    2. 某些业务必须使用内购
      如果销售的商品应该使用"苹果内购", 而没有使用, APP将不允许上架.

    内购的产品类型

    1. 非消耗品(Nonconsumable)

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

    1. 消耗品(Consumable)

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

    1. 其他类型

    以下三种类别在iBooks中使用,目前iBooks不支持大陆市场
    免费订阅(Free subscriptions)
    自动续费订阅(Auto-renewing subscriptions)
    非自动续费订阅(Nonrenewing subscriptions)

    1. 内购的流程 类似于商场购物流程, 参照下图
    image.png
    1. 内购演练

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

    相关文章

      网友评论

          本文标题:IOS 内购

          本文链接:https://www.haomeiwen.com/subject/kolvahtx.html