美文网首页ios 进阶iOSer 的自我修养iOS开发那些事
iOS内购-iap-In-App Purchases-开发及注意

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

作者: 狗带儿 | 来源:发表于2016-07-01 20:49 被阅读11256次

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

    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提供了这个方法,验证这步可以写在前端,也可以写在服务器端,这个自己看情况决定吧...
    
            ### //   !! 这里有一种情况需要注意。程序走到这里的时候,已经是支付成功的状态。
            ### // 此时用户的钱已经被苹果扣掉了,接下来需要做的是验证购买信息。
            ### // 但是如果在 '购买成功'——'验证订单' 中间出现问题,断网、App崩溃等问题的话,会出现扣了钱但是充值失败的情况
            ### // 所以在这里可以将下文中的验证信息存在本地,验证成功再后删除。验证失败的话,可以在每次App启动时将信息取出来重新验证
    
              // 购买验证
              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无法转让。。。。。。

    以上

    相关文章

      网友评论

      • 杨老师红烧肉:楼主救命。
        发件人 Apple
        3. 1.1 Business: Payments - In-App Purchase
        Guideline 3.1.1 - Business - Payments - In-App Purchase

        We noticed that your app uses in-app purchase products to purchase credits or currencies that are not consumed within the app, which is not appropriate for the App Store.

        Next Steps

        To resolve this issue, please revise your app to ensure that the credits or currencies purchased with in-app purchase products are used within the app or remove the in-app purchases entirely.

        Request a phone call from App Review

        At your request, we can arrange for an Apple Representative to call you within the next three to five business days to discuss your App Review issue. Our representative will be able to discuss the issue in English or Chinese.

        Request a call to discuss your app’s review.

        申请应用审核团队致电联系

        如果您有需要,我们将根据您的要求在三到五个工作日内安排一位精通中文的苹果公司代表致电与您联系,讨论您的应用审核结果。
        申请应用审核团队致电联系

        申請應用審核團隊致電聯繫

        如果您有需要,我們將根據您的要求在三到五個工作日內安排一位精通中文的蘋果公司代表致電與您聯繫,討論您的應用審核結果。
        申請應用審核團隊致電聯繫

        Since your App Store Connect status is Rejected, a new binary will be required.
      • 托斯卡纳丶:请问作者,我们的App内查看别人资料的时候用的内购,要求的是,查看一个人的资料之后再次查看这个人是不需要付费的,但是再查看其他人资料还是需要付费,设置的是消耗型产品,结果苹果说要设置成非消耗型...请问是他们的理解有错还是确实需要改啊..
      • 329fd8af610c:楼主你好 我创建内购产品的时候属性定义是非续期订阅但是被拒的时候还是回复这个Guideline 3.1.1 - Business - Payments - In-App Purchase 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.该怎么处理呢
      • zbyinter:您好!我们最近也被苹果盯上要搞内容,有两个问题想向您请教一下:

        1、我们的app是一个照片出售平台,用户通过app上传并出售照片,但是这个照片一般都是需要通过第三方编辑软件(PS之类)编辑之后才能使用,也就是说不能用在app里面,按理说应该不属于内购范畴,但是被苹果强制要求增加内购,您看这个是否属于内购?

        2、如果增加内购的话,由于用户出售照片时定价都是随意的,所以没办法提前设定价格档位,是不是只能通过中间货币的方式处理?先充值中间货币,然后用中间货币购买照片,这种应该算是消耗型产品吧?

        望帮忙解答!万分感谢!
        zbyinter:@狗带儿 这个不在app内使用的也算作内购吗?虽然是虚拟的数字产品,但是使用场景不在app内,这点我们一直都很困惑,视频、图书一类的是可以在app内观看的,而照片下载下来也只是通过手机系统相册查看的。
        狗带儿:创建消耗类型的商品就行,当做中间货币
        狗带儿:@zbyinter 1.属于内购,与购买视频和购买图书相似
      • 有你陪着我_7674:您好,我想知道非消耗产品在哪里添加 "恢复按钮".第一次购买"恢复按钮"会出现吗?我的是购买之后,就不会在进入购买界面了!
        狗带儿:@有你陪着我_7674 非消耗性商品的意思就是不能被消耗,只能被购买一次,框架里有恢复购买的api,按钮调用内个就行了
        有你陪着我_7674:@狗带儿 我想知道 这个恢复购买按钮实际上没什么作用也可以吗?因为只要进购买界面的都是未购买过的!感谢你的回复!
        狗带儿:@有你陪着我_7674 加哪都行,能让审核人员看见就行
      • 皮乐皮儿:内购的坑确实多,我这里有个大坑,还望大神看怎么填。在构建payment的时候,为了方便查找订单,我设置了mutablePayment.applicationUsername ,这样正常情况下,支付完成,在观察者返回的数据中,每一笔交易带的都有这个applicationUserName,但是苹果总是会抽风,有时候transaction.payment.applicationUsername为空,导致一些莫名其妙的问题,遇到这种,大神是怎么处理呢?我好奔溃,内购这么难用,苹果为何孜孜不倦的阻挠开发者使用别的平台,发个牢骚
      • Nbm:这个框架里有做漏单/丢单处理吗
      • awesome___:请问楼主,如果需要往app中充值余额,然后也可以将余额提现到第三方,那充值也要走内购的方式吗?如果走内购,苹果抽成后,那提现只有那剩下的70%吗?有点坑啊
      • 悟_空: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.

        我遇到了这个问题, 本来选的是消耗型,他让我 换成 非更新续订,好吧,我改成非更新续订,他又说我的商品不对,报的还是这个错误
        Guideline 3.1.1 - Business - Payments - In-App Purchase


        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.

        Next Steps

        To resolve this issue, please delete your consumable in-app purchase products, then create separate non-renewing subscription in-app purchase products for each item that the user would have exchanged those consumable products for. This product type matches the usage model for the products you are ultimately selling to your users.

        Note: The product type cannot be changed once an in-app purchase product has been created. Therefore, you will need to create a new in-app purchase product with the correct product type.

        To create new in-app purchases:

        - Log in to iTunes Connect
        - Click on "My Apps"
        - Select your app
        - Click on "Features" to create new in-app purchases
        - Click Save
        - Once you've completed all changes, click the "Submit for Review" button at the top of the App Version Information page.

        Resources
        真是无语了
        狗带儿:看一下截图吧,苹果说的是你用货币去购买了订阅类型的商品,比如用货币购买会员啥的
        悟_空:请指教我怎么改啊,app审核都拖了一个月了,库克他娘的哔了狗
      • Love_iOS:请问楼主,视频类型的支付,是不是应该选择Non-renewable subscriptions 类型,选择这种类型的内购,付款的时候,可以提示用户登录吗?还是游客模式也可以进行购买?
        狗带儿:购买视频的话类型应该是'非消耗型商品','非消耗型商品'需要游客购买,不建议这么做,做成充值货币,然后用货币购买视频更好
      • HZhenF:楼主 你好
        我最近在做订阅型的内购
        苹果服务器老是给我返回21004 说我共享密钥不匹配
        我用的是网上的代码 不知道如何添加共享密钥
        可以指示一下吗
      • a0b6e2a49203:楼主请问网易云课堂怎么实现内购项目自定义价格的呢?最新版应该使用的还是苹果内购支付
        a0b6e2a49203:@狗带儿 嗯 那网易可就定义了超多档位价格啊!!让我感觉上就像是自定义的。。
        狗带儿:价格没法自定义,只能在苹果提供的分档里选择,网易云课堂内个没有自定义,就是有很多档价格的商品
      • 严念仁:您好,第二条,想要删除通过审核的内购产品,页面刷新后又重新回来了。这个遇过了,您如果申诉要怎么处理呢?
        严念仁:@狗带儿 我想知道这样是不是有申诉通过,你之前申诉过的话,是马上更新状态吗?卡审核一个月了,很纠结。求解答.................
        严念仁:@狗带儿 我回复后,他发来这个!具体是什么意思? Your app is still in review but is requiring additional time. We will provide further status updates as soon as we are able.
        狗带儿:就是去开发者网站里给苹果发邮件反应你这个问题就行,最好录个视频
      • 海边的樱桃树:使用[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]来获取支付凭证,会包含很多之前的老订单,请问是怎么处理的呢?
        疯狂的小码农:请问这个你们怎么处理的?我也遇到同样的问题,数据量太大后台不让通过。
      • 风沙搁浅的希望:你好,沙盒模式下内购已经OK了,每次支付的时候只能用登录密码付款,如何用touch id验证支付?(设置中Touch ID与密码->iTunes Store与App Store已打开)
        636ccfc89aac:@狗带儿 请教下楼主 在测试内购的时候付款弹出框只能用密码支付 我尝试了别人的软件是可以弹出指纹支付的 如果是系统的原因的话 这个问题是偶发性的还是会一直这样不变?
        636ccfc89aac:我现在也遇到这个问题 没办法显示用指纹支付 你发现是什么原因了么?
        狗带儿:@风沙搁浅的希望 内个不是代码控制的,系统级的
      • c73dff241440:『1.一般发生于首次提交app或添加新商品,当你的app通过审核以后,你发现在生产环境下获取不到商品,这是因为app虽然过审核了,但是内购商品还没有正式添加到苹果的服务器里,耐心等待一段时间就可以啦~』现在我就是这个问题...审核通过了,从App Store把应用安装好后。。。进行内购发现不能获取到商品信息...我想说的是『耐心等待一段时间就可以啦』这个一般需要等多久:joy:
        狗带儿:如果商品状态正常的话不会超过一天
      • 1cdb19c230be:你好 关于漏单处理 这块有做吗
        狗带儿:@superWWWWWWW 在用啊
        1cdb19c230be:@狗带儿 我发现如果使用IAPhelper的话 很多预想到的错误 不太好实现 你现在还是用IAPhelper这个吗
        狗带儿:当时做的就是在支付成功后把订单信息存在本地,验证成功后删除。然后在某个时间点来判断本地有没有存储漏单信息,如果有存储,就拿出来重新验证一下。这种处理方法不太好其实,更深入的我没去研究
      • 71178a15dfeb:We noticed that your app’s IAP feature includes information about Apple’s Policy, which is not relevant to the app’s content and functionality.

        Please refer to the attached screenshot/s for more information.

        这是什么问题?楼主。苹果的描述一如既往这么不知所云。
      • 属七降九:请问 使用内购的沙箱测试时 要获取到产品的信息,必须要这个财务表审核通过之后才能获取到吗?我的财务申请表状态是 processing 正在审核,通过产品ID 获取不到产品信息。
      • 洁简:请问一直返回商品是空的怎么回事呢?
        狗带儿:上线商品用正式账号,未上线商品只有沙箱账号能访问
        洁简:@狗带儿 id随便写的123没错,商品一直没有返回和沙盒账号没关系吧.
        狗带儿:@洁简 检查商品id是否正确,检查测试使用的apple账号是不是沙盒账号
      • younger_times:请问作者,trans.transactionState == SKPaymentTransactionStatePurchased 就是付款成功才走的这一步么?

        [[IAPShare sharedHelper].iap checkReceipt:receipt onCompletion:^(NSString *response, NSError *error) {}
        验证response,返回的很长一串,如何知道是验证成功?很急的~
      • 我是安pp:如果一个app是纯本地工具类app,没有自己的后台服务器,可以接入iap吗
        敏敏哇敏敏:@Cooliean 可以 本地自己验证付款成功
        Cooliean:可以的吧
      • 流年划过颜夕:app内只有消耗品也要添加恢复购买的按钮的按钮吗
        皮乐皮儿:不用,恢复操作只针对非消耗性的商品
      • Hu1輝:楼主你好,能请教一下么?我们的产品就像你在文中说的是通过消耗品来购买订阅课程,但是被苹果拒绝了很多次,要求我们使用非自动更新订阅模式。
        狗带儿:@Hu1輝 审核团队明确要求了的话,建议按着审核团队的要求来做,毕竟不同的审核团队审核尺度也不一样
      • Dismon:请问,你有没有遇到这种情况,测试内购的时候,总是成功一次,失败一次,然后成功一次,失败一次

        第一次能购买成功,然后第二次购买能够弹出确认框,点击购买返回 SKErrorDomain Code=0 无法连接 itunes 的错误,然后再次购买,又能成功
        Senvid丶:我也遇到过,好像是个人开发者账号都有这个问题,金额大于50就没有问题了,不知道是不是苹果的bug
        Dismon:@狗带儿 我无线,4g 都是过了,都不行,代码也不光试自己的,还试了几个第三方封装的内购比如RMStore,IAPHelper,都是同样的问题,好奇怪,博主你有空能试一下你的代码吗
        狗带儿:@Dismon 没有遇到过啊...
      • 醉起萧寒:为什么网易云课堂可以绕过iap
        狗带儿:@醉起萧寒 他以前做的是IAP,现在可能是跟苹果沟通了,或者是一些手段绕过了审核
      • KChuck:你好,请教一个问题。我们的app是购物的,其中有个成为会员,一年360块,就可享有优惠打折啥的。只有线上的,没有线下。 这个购买会员一定要走内购吗?
        皮乐皮儿:@Karl0n 你走支付宝成功了吗?我们也是会员,只有会员才能观看app的一些视频,这个和你那应该差不多,走内购各种奇葩问题,坑实在特么的多,我想放弃内购,又怕审核通过不了
        KChuck:我先和老板打个招呼… 先走支付宝。保不行再内购
        :joy:
        狗带儿:@Karl0n 如果会员没有其他功能,只是商品打折的话我觉得应该可以向苹果说明一下走三方支付吧,毕竟不涉及到应用内功能,不过苹果爸爸的心思谁知道呢(摊手)
      • 463a3f1fae5c:请问一下 我是做第三方SDK 给别人的游戏接 想在自己的SDK里增加内购功能 这样能实现吗 因为SDK会给很多不同的游戏接 请问能实现吗 拜托了
        463a3f1fae5c:@狗带儿 好吧~
        狗带儿:@ferrymanCEO 肯定不能,内购的商品是跟app绑定的
      • 博博博博博博:坑~~~~~
        狗带儿:@博博博博 恩,刚开始做内购时确实是一脚一个雷,熟悉了以后就好多了
        博博博博博博:@狗带儿 哈哈,不是说你坑啦,我说内购审核等一系列坑
        狗带儿:@博博博博 啥?
      • 7d6dc7c79570:楼主,想问一下,后续添加消耗型商品怎么添加?只需要在itunesconnect上面添加商品信息,并同时与后台商品列表一致就可以了吗?
        狗带儿:@jing_428 第一次提交的app,app和iap商品必须同时审核,之后添加的商品跟app是分开审核的,不需要传新的app版本,添加完等待商品审核通过就能用了。付费型的app必须要填写银行和税务信息啥的,好像有个免费订阅类型,内个不用填
        7d6dc7c79570:@狗带儿 审核?每添加一次内购产品都要进行上传审核吗?
        另外还有个问题:我只想做个内购的demo试一下,在创建app的时候也需要填写真实的银行信息吗?不配置可以吗?
        狗带儿:@jing_428 先在itunes connect上添加,审核通过了后台再添加就行
      • 秒赞不是偶然:你好 ,问你个问题 内购的时候上线的时候 [IAPShare sharedHelper].iap.production =NO;是沙盒地址, [IAPShare sharedHelper].iap.production =Yes 是线上地址, 这个库上线提交审核的时候应该设置什么 ?谢谢
        秒赞不是偶然:@狗带儿 回台验证为啥会被拒
        秒赞不是偶然:为啥后台验证没有用
        狗带儿:@秒赞不是偶然 如果你做前台验证,上线时要设置YES,后台验证的话这行代码没有用
      • 丶Destinyxl:验证订单的时候 trans.transactionReceipt 替换成 [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]
        狗带儿:@LL_Summit 谢谢,我之前会用了只是忘了更新,因为我们是服务端验证所以跟你的情况可能不太一样
      • 丶Destinyxl:问一下 内购有限额吗? 比如说我们的会员一年2万这种 可以一次性支付吗
        狗带儿:@LL_Summit 可以做成订阅类型,也可以做成用内购来的货币购买
        丶Destinyxl:@狗带儿 如果是会员 应该是选订阅类型的内购项目吧?
        狗带儿:@LL_Summit 消耗型商品最高99刀,非消耗型没有限额,但是你要看他有没有提供内个额度的分类
      • 1b9fdb714eb2:多谢楼主分享
      • 冉俊:我正要做内购。
        冉俊:@全地图唯一野生Npc 看来你也是入过地狱的人。:smile::smile::smile:
        狗带儿:@冉叔叔 祝你好运......这里坑挺多的

      本文标题:iOS内购-iap-In-App Purchases-开发及注意

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