
iOS内购这块的开发一直比较麻烦,除了各种购买选项的问题,最恶心的问题就是丢单问题。
丢单就是iOS内购过程中付了钱,但是App没有发货的问题。要解决丢单问题,先要梳理一下整个购买的过程:
以上就是整个购买的过程,现在我们根据每一步分析下可能出问题的点
这一步的 *** 作就是让服务器创建当前购买商品的订单,返回结果失败或者成功,这里基本不会出问题,成功就继续接下来的流程,失败的话,客户端返回失败的提醒就行。
绝大多数的问题都出在这里,在这里说一下我遇见的坑
对于第一个问题,内购的api有一个监听机制,在每次app刚启动的时候调用 [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 方法, - (void)paymentQueue:(SKPaymentQueue )queue updatedTransactions:(NSArray )transactions ,会回调所有未执行 [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 的transaction,这个时候再去和服务器进行订单的验证。这里还有一个很麻烦的问题,在上个流程中,调用服务器创建了订单,会返回一个订单号,验证的时候一般都是把订单号,以及receipt,transactionid一起发送给服务器,但是这里是拿不到订单号的。针对这个问题,网上有人用 applicationUsername 这个字段去存入订单号,但是也有一些人在使用这个字段的时候出现了Bug(App杀死后,获取这个字段的值为空,参见下面的引用),为了保险,这里还是不用字段。我的解决方案是在用户创建完订单之后,存储当前的订单信息,用户token等等,当购买完之后,再去取这个订单信息,完成验证,删除订单,这个方案的核心是永远只存储一个订单,若在购买的时候有未完成的订单,必须先验证之前的订单,验证完之后,再去发起新的购买,这样就能规避多个transaction不能匹配订单号的问题;
对于第二个问题,这个问题好解决,不用这个第三方就行,自己造个轮子,基本的购买逻辑很简单,没必要用这个插件。当 - (void)paymentQueue:(SKPaymentQueue )queue updatedTransactions:(NSArray )transactions 返回的transaction的state为failure时候,finish这个transaction,state为purchsed的时候,去验证。
这里还有一个问题,finishTransaction:的调用时机,一定要在与服务器完成验证之后,再去调用这个方法,因为在与服务器的验证的过程中,也是会出现错误的,如果再购买成功回调之后就调用这个方法,验证错误的订单也被finish了,下次去取transaction的时候,就取不到了,这样就造成了丢单问题。
这里的逻辑基本就是自己的了,跟苹果内购关系不大,把订单、receipt等信息发给服务器就行,唯一需要注意的问题就是网络错误,这个时候我会做一个轮循,在发生错误的时候,轮循几次,超过这个次数,认为验证失败,等到用户购买下一个商品、或者app重新启动,会重新验证这个订单(当然,这个情况是极少的!为了严谨,做了以上处理)
终于到最后一步了,这里有一个地方需要注意一下,就是本地服务器与苹果服务器验证的方式,之前我们公司出了个问题,在调用 /verifyReceip 这个接口去验证,苹果会返回一个数据status,它们认为status等于0就是完成购买了,但是这个字段的含义并非如此
它只是反映这个receipt是不是完整的,并不能证明这次购买完成。正确的做法应该是服务器拿到此次的transaction和receipt之后,解析receipt,拿当前的transaction和receipt里的transaction数组去比对,若数组中有这个transaction对应的transactionid,则认为购买成功。
苹果服务器返回的错误码中,我们只需留意21005即可,它代表验证服务器当前不可用(当然这种情况是级级级小的!为了严谨),处理的方式和网络错误的处理方式是一样的。
原因有一下几种:
1没有登陆苹果iD
2网络信号不好
3该商品需要花钱购买
4该商品已下架。
苹果XR是苹果公司设计、开发与销售的一款智能手机,于北京时间2018年9月13日凌晨1点在史蒂夫·乔布斯剧院秋季新品发布会上发布。iPhoneXR搭载61英寸LCD全面屏,分辨率为1792x828具备326PPi;配备面容ID以支持解锁、登录和支付;搭载新一代神经网络引擎A12仿生芯片;后置1200万像素广角摄像头;防水等级在IEC60529标准下达到 IP67级别;最高拥有256GB的容量。
responseproducts商品返回列表为空
responseinvalidProductIdentifiers无效产品id有数据
可以检查一下原因:
2商品信息是否配置到iTurn Connect,并到达“准备提交”状态
3在iTurn Connect中创建沙盒测试员,并收取邮件激活。之后登录到测试用手机的设置页面中(Store选项)。
4是否创建相应的provisioning profile,并用此签名App。
5iTurn Connect后台配置完商品信息后,是否等待若干小时生效。
6SKProductsRequest请求的商品Id必须和iTurn Connect中配置的一致。(如:comtestproductxxx)
7iTunes Connect中配置的银行、税务信息是否正确。
8是否先删除旧App,再重新编译生成新的。
9请不要使用越狱手机测试。
第一次被拒原因如下:
Guideline 511 - Legal - Privacy - Data Collection and Storage
We noticed that your app requires users to register with personal information to purchase non account-based in-app purchase products, which does not comply with the App Store Review Guidelines
Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user
翻译
我们注意到您的应用要求用户注册个人信息以购买非基于帐户的应用内购买产品,这不符合App Store审核指南。
在允许访问应用程序内容和与用户无关的功能之前,应用程序不需要用户注册。
这个问题是说您的App在进行购买商品的时候,强制了用户去登录注册,苹果的内购要求即使用户不登录注册,也可以进行购买商品,所以您需要加一个匿名购买的功能。
第二次被拒
Guideline 21 - Information Needed
We have started the review of your app, but we are not able to continue because we cannot locate the in-app purchases within your app
翻译
我们已开始审核您的应用,但我们无法继续,因为我们无法在您的应用中找到应用内购买。
从翻译上来看,苹果没有找到应用内购买,但是商品明明就在那里,为什么你就找不到呢?我整理了一遍购买流程加上图解流程,给苹果添加附件,然并卵,依然被拒,还是这个原因,此时您可以查看一下,你在苹果开发者后台中配置了几个商品,如果您配置了三个商品,比如,你在开发者中配置了三个视频商品,水浒传,西游记,和三国演义,但是此时服务器数据还没有录入完成,只录入了水浒传,在app 上只能购买水浒传,没有西游记和三国演义,那么苹果说找不到商品的意思就是这个。这个被拒坑了我一周的时间。
第三次被拒
uideline 21 - Performance - App Completeness
We found that while you have submitted in-app purchase products for your app, the in-app purchase functionality is not present in your binary
翻译
我们发现,虽然您已为应用提交了应用内购买产品,但您的二进制文件中不存在应用内购买功能。
这个好像和上一个解决办法一样,目前我是按照这种方法解决的
第四次被拒
Guideline 311 - Business - Payments - In-App Purchase
We found that your app offers in-app purchases that can be restored but does not include a "Restore Purchases" feature to allow users to restore the previously purchased in-app purchases, as specified in the "Restoring Purchase Products" section of the In-App Purchase Programming Guide :
"Users restore transactions to maintain access to content they've already purchased For example, when they upgrade to a new phone, they don't lose all of the items they purchased on the old phone Include some mechanism in your app to let the user restore their purchases, such as a Restore Purchases button"
To restore previously purchased in-app purchase products, it would be appropriate to provide a "Restore" button and initiate the restore process when the "Restore" button is tapped by the user
这个问题就比较坑了,一开始一直没明白什么意思,同样的问题也是打回来了好几次,首先在这里和大家说一下 ,看见被打回来的原因中有一段是标蓝的吗?这里是开发文档,一定要去看看,一定要去看看 一定要去看看,重要的事情说三遍,这个问题的大致意思是要让你加一个恢复购买功能?what? 什么叫恢复购买功能,先不要慌,首先他让你加恢复购买功能,您先看一下您选择的商品类型是什么类型?非消耗性?如果是这个,那么您遇到的和我是一样的问题,就是AppleID 只要是购买的非消耗性产品,那么他就永久可以使用,这个永久不是时间的永久,当你换手机,换你开发应用的账号,都要可以恢复已经购买的产品,比如你开发的app 用你的手机号注册 你的AppleID 购买 之后你 等我我的手机号注册 此时还是你的AppleID 那么就要有一个恢复购买功能,不合理?NO!那是苹果爸爸,并且这个恢复功能,要时刻展示出来,不用提前判断用户AppleID 是否购买过该商品,好了 到这里 我要去上架了 !!!!
以上就是关于iOS内购丢单的解决方案全部的内容,包括:iOS内购丢单的解决方案、苹果xr无法获取商品信息、iOS 内购返回商品列表ID为空等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)