五. 内购

内购

一. 内购的简介

  1. 何谓内购

    • 在iOS的App中, 如果你要购买某件商品, 使用苹果的支付方式进行购买, 即为内购
    • 苹果规定, 如果你在App中销售商品, 跟App功能相关, 那么你就必须得通过内购的方式购买
    • 比如游戏中常见的关卡/游戏币购买
  2. 内购的缺点

    • 从商家的角度来看, 苹果会从内购中抽成, 比例为3 : 7, 也就是说你卖10块钱的东西, 苹果会平白拿走你3块钱, 真流氓....
    • 从用户的角度来看, 内购支付, 需要用户绑定银行卡, 操作流程比较繁琐, 比如本人, 第一次看到内购的步骤就不想用这个方法了
    • 从商品的价格角度来看, 内购只能用苹果指定的价格售卖, 不能自定义, 再次重申苹果的流氓度
  3. 为什么要用内购

    • 内购作为一种营销方式: free + 内购, 在一定意义上还是能起到不错的收益
      • 如果你的App是采用直接收取App费用的方式, 那么估计你在国内是卖不出去了, 因为不符合国人的消费习惯
      • 广告: 一般广告都会内嵌在App中, 他可以给开发者带来收益
      • free+内购的模式, 可以先让用户体验你的App, 然后在让用户决定是否要掏钱, 比较亲民
    • 但是, App中的某些业务功能, 苹果规定必须使用苹果内购, 如果你没使用, 苹果是不会上架你的App的(流氓!!!重要的事情说三遍)
    • 不过相对的, 在AppStore中下载软件, 都是可以放心使用的, 这点还是要给苹果点个赞的

二. 内购的流程模拟

  1. 当App创建出来时候, 你要告诉苹果你要出售哪些物品
  2. 服务器作为提供方法, 将商品提供给购买的用户
  3. 苹果公司要验证你的商品是否可以销售, 同意的话才能卖
  4. 当用户购买某个内购物品的时候, 会向App的服务器发送请求
  5. 当服务器收到用户的请求之后, 会给用户一个连接, 类似于开具一个售卖小票
  6. 用户此时要将在苹果方付账
  7. 当苹果方受理了用户的购买请求时, 就会给交费后的用户授权, 然后通知服务器给用户发放产品

三. 内购的简单测试

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

    • 创建一个可以内购的套装ID, 即一个明确的APP ID
    • 在ITunes Connect的用户与智能中, 要创建一个沙箱技术测试员
  2. 创建一个需要销售的商品, 并且添加到App

    • 重点: 添加内购商品时, 需要保证税务信息的完整性, 如果不完整, 产品信息不完全, 就无法申请内购
  3. 内购的产品类型

    1. 非消耗品
      • 购买之后就一直存在, 不会消耗掉, 比如游戏中的关卡
      • 非消耗物品购买之后, 拥有永久的使用权利, 并且能被用户再次下载, 且可以在其他设备上下载
    2. 消耗品
      • 有使用次数的物品
      • 一般被设定为某些可消耗的物品或是服务, 并且使用之后不能再次下载
      • 消耗品不能再用户的设备之间跨设备使用, 他一般与用户的账号绑定的
    3. 其他类型
      • 免费订阅
      • 自动续费订阅
      • 非自动续费订阅
      • 这三种一般适用于iBooks中, 但是目前大陆市场还不支持iBooks的各种订阅.....
  4. 内购的代码实现

    1. 配置App的Bundle ID, 要与配置内购信息时的Bundle ID相同
    2. 代码实现
      • 首先要导入StoreKit.framework框架

      • 创建一个工具类, 并且创建一个类方法, 用于发送商品的请求

        class func getData(resultBlock: (goodsIds: Set<String>)->()) {    
              resultBlock(goodsIds: ["com.fh.neigou.wupin1", "com.fh.neigou.wupin2"])
          }
        
      • 从App服务器请求数据列表, 并且向苹果服务器请求可以销售的商品列表

        // 1. 从服务器请求, 需要被销售的商品, 但是, 具体商品能不能被销售, 还需要到苹果服务器去验证才可以
        DataTool.getData { (goodsIds) in
            // 2. 想苹果服务器发送一个请求, 来验证, 哪些商品可以被销售
            // productIdentifiers: 验证的时候, 是靠商品的ID, 来进行验证
            
            let request = SKProductsRequest(productIdentifiers: goodsIds)
            // 开始发送请求, 进行验证(接口都封装在方法内部)
            // 接收请求下来的结果
            request.delegate = self
            request.start()
        }
        
      • 在代理方法中, 获取并显示销售列表

         // 当苹果服务器验证哪些商品可以被销售, 完成之后, 就会通过这个方法, 来告诉我们验证的结果
         func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
              // 需要展示可以被销售的商品
              print(response.products)
              products = response.products
              
              print(response.invalidProductIdentifiers)
          }
        
      • 点击购买商品, 创建支付对象, 放入队列中, 并且设置交易队列的监听对象, 监听每一笔交易

          override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
              
              // 购买点击的商品
              // 1. 取出商品
              let product = products[indexPath.row]
              
              // 2. 购买商品
              // 2.1 根据商品开一个小票
              let payment = SKPayment(product: product)
              
              // 2.2 拿着小票去付款
              // 添加到一个支付队列里面
              // 只要把一个支付对象, 放到支付队列里面, 就开始进入支付流程
              SKPaymentQueue.defaultQueue().addPayment(payment)
              
              // 2.3 设置交易队列的监听对象, 监听里面存放的每一笔交易
              SKPaymentQueue.defaultQueue().addTransactionObserver(self)
          }
        
      • 调用支付的代理方法, 当一笔交易的状态发生改变时, 就会调用这个方法, 获取支付的状态

          for transaction in transactions {
              switch transaction.transactionState {
              case .Deferred:
                  print("延迟购买")
              case .Failed:
                  print("支付失败")
                  // 应该移除交易
                  queue.finishTransaction(transaction)
              case .Purchased:
                  print("支付成功")
                  // 应该移除交易
                  queue.finishTransaction(transaction)
              case .Purchasing:
                  print("正在支付")
              case .Restored:
                  print("恢复购买")
                  // 应该移除交易
                  queue.finishTransaction(transaction)
              default:
                  print("交易可能挂了...")
              }
          }       
        
      • 恢复购买, 对于用户已经购买过的商品, 可以直接发送请求, 并且给用户提供商品

          SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
        
  5. 内购的测试

    • 创建测试者账号
      • 在iTunes Connect中的用户和职能中创建
      • 创建沙箱技术测试人员
      • 要注意, 测试账号不能是注册的真实存在的App ID
    • 最好使用真机进行测试, 并且账号为添加的测试者账号
  6. 查看内购的销售情况

    • 登录iTunes Connect
    • 进入销售趋势, 在里面可以看到最近购买的情况
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容