iOS内购-iap-In-App Purchases-开发及注意事项

*深坑记录,以后发现一些不常见的坑可能会更新

1.一般发生于首次提交app或添加新商品,当你的app通过审核以后,你发现在生产环境下获取不到商品,这是因为app虽然过审核了,但是内购商品还没有正式添加到苹果的服务器里,耐心等待一段时间就可以啦~

2.我创建的IAP商品,当我不用,想删除时,发现无法删除,我点击删除按钮以后,页面就自动刷新,刷新回来,那条商品依然存在,我换了N多浏览器,连手机浏览器都试了,就是不行,没办法只能提交审核,然后苹果给我反馈说他们找不到我这个商品在哪......

  • 解决办法:审核时在附加里向苹果说明情况,最好录个视频上传到网站上(优酷就可以),把视频地址给苹果
  • 后续:当时有过申诉,但是因为苹果只会给注册开发者账号的邮件发信息,而老大每天都不在公司,所以与苹果的沟通终中断了。我在将App转移账号以后,这个Bug消失了,不知道是转移账号解决的还是苹果修复了。

一:iap开发

具体的开发过程不太想写了,网上太多了,随随便便百度一下就有好几页,这里只给大家推荐一个库,使用起来很方便
下载地址: IAPHelper

NSSet* dataSet = [[NSSet alloc] initWithObjects:@"这里是iap商品id", nil];
  [IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet];

// 请求商品信息
[[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest* request,SKProductsResponse* response)
   {
    if(response.products.count > 0 ) {
     SKProduct *product = response.products[0];

     [[IAPShare sharedHelper].iap buyProduct:product
           onCompletion:^(SKPaymentTransaction* trans){
         if(trans.error)
         {
         }
         else if(trans.transactionState == SKPaymentTransactionStatePurchased) {
          // 到这里购买就成功了,但是因为存在越狱手机下载某些破解内购软件的情况,需要跟苹果服务器的确认是否购买成功
          // IAPHelper提供了这个方法,验证这步可以写在前端,也可以写在服务器端,这个自己看情况决定吧...



          // 购买验证
          NSData *receipt = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
          //网上的攻略有的比较老,在验证时使用的是trans.transactionReceipt,需要注意trans.transactionReceipt在ios9以后被弃用
          [[IAPShare sharedHelper].iap checkReceipt:receipt onCompletion:^(NSString *response, NSError *error) {}];
          
  
    }
    else if(trans.transactionState == SKPaymentTransactionStateFailed) {
          if (trans.error.code == SKErrorPaymentCancelled) {
          }else if (trans.error.code == SKErrorClientInvalid) {
          }else if (trans.error.code == SKErrorPaymentInvalid) {
          }else if (trans.error.code == SKErrorPaymentNotAllowed) {
          }else if (trans.error.code == SKErrorStoreProductNotAvailable) {
          }else{
          }
       }
    }];
    }else{
          //  ..未获取到商品
    }
   }];

关于内购的开发大概就这些,网上攻略贼多,大概搜索一下就能写的出来,iap开发起来虽然不难,但是玛德法克这里面坑实在太多...

二:iap开发时的注意事项

1.什么情况需要使用iap,什么情况使用三方支付

这里我的理解是:

购买的东西是实物,不存在于APP中,用三方支付,比如淘宝等一堆电商,他们的商品都是不存在于App中的。
如果你的支付和购买是为了解锁App的功能,就一定要用iap,即内购

举个栗子:现在有很多在线教育App,比如网易云课堂,腾讯课堂,可以在App中购买视频并在APP中观看,也就是说 '观看视频' 这个功能是本身就存在于APP中的,只是需要你先购买视频,才能使用'观看视频'这个功能,这个时候,这种解锁APP已有功能的操作,就必须要使用iap

2.关于商品类型:iap创建商品时选择的商品类型大概分三类

Paste_Image.png
1.消耗型商品:

类似游戏中的钻石,还有现在某些APP中的货币,比如斗鱼里的鱼丸、映客里的映票。会被消耗的,要选择消耗型商品

2.非消耗型商品:

无法被消耗的商品,比如上文提到的视频课程,一次购买,就应该永久可以观看

3.订阅类型商品:

多用于会员,会员也可以做成用 消耗型商品获取的货币来购买

现在不行了,之前提交过很多都没事,也许以前会员功能存在感太低审核团队没发现?又或是最近的新规,新提交的版本因为这个原因被拒了,错误描述:
Business - 3.1.1 We noticed that your app is using Consumable In-App Purchase products as intermediary currency for the exchange of items that function as Non-Renewing Subscriptions.

这里要提一点:如果你的公司是外包公司,有订阅类型商品的APP一定要用客户的账号提交审核,因为当APP中有过订阅类型商品,注意是有过,创建过再删除也算,这个APP无法被转移账号

3.注意事项

1.当你使用消耗型商品

大多数的消耗型商品都是需要登录的,因为需要在数据库存余额嘛。
需要注意的是:在登录之前,你最好不要让用户看到商品,有可能会因为这个原因被拒(看运气),栗子:

如上图。这是充值页面,即商品页面。
你有两个选择:
# 1.增加游客购买,即用户到达充值页面,点击充值时,即使用户未登陆,也能充值

 # 2.让未登录用户无法到达充值页面。且必须要由用户来选择

   栗子:有个按钮,点击跳转此充值页面,当未登录用户点击按钮时,
   你必须要弹出选择框,由用户来选择是登录/注册或者取消,并说明情况 
   如下:
2.当你使用非消耗型商品

当你使用非消耗型商品时,你需要添加一个恢复购买的按钮
这个常见于各种游戏中,其实知道这个规定以后还是挺好理解的,非消耗型商品是不可被消耗的,一次购买终身使用的,非消耗型的商品是跟appleId绑定的,就是你平时下载APP让你输入账号密码的内个。
你需要一个恢复购买的按钮,来让用户恢复他购买的内容,上面内个IAPHelper也有这个方法,自己看一下

3.订阅型商品

使用或曾经使用过订阅型商品的APP无法转移

在苹果帮助里,有个分类是:什么样的APP可以被转让
我一看,完全符合啊,然后就是开发、提交审核、通过,但是当我转让时却TM提示我无法转让,当我再次回去查看帮助,向下拉网页拉倒底部时
发现有另一个分类:为什么我的APP无法转让。。。。。。

以上

推荐阅读更多精彩内容