最近给app增加内购移除广告功能,刚开始还比较顺利,把网上找到的内购代码,简单修改加入到app内,基本能用,测试完成后,提交审核。第一次提交,有点问题被拒,根据具体问题进行改正后,再提交,审核就通过了。接连提交了5个app,全部审核通过。这可以说明,app内所用的代码应该不会有什么问题,否则,5个app都通过审核,就不太正常了。

但是,再把一个app加入内购代码,同样进行了相关沙盒测试,提交审核时,意外的情况出现了,被拒绝!大约花了一周多一点的时间,反复修改提交,多次被拒,最终才得以通过审核。可是,苹果审核中出现的问题,又是如何被解决的?或者说究竟是什么原因造成审核中出现问题,至今,我仍然没有搞明白,算是稀里糊涂的通过了。当然,从这个app审核通过后,后续所有的App都顺利通过了审核,没再出现任何问题。

经过一段时间的努力,把一些适合加入内购的app,都加入付费移除广告功能,尤其是加入倒计时等待内购加载之后,效果还是非常好的,内购的量明显暴增。因为增加了倒计时等待,用户看到等待画面,知道需要等待,当然,也是不得不等待购买页面的弹出,不至于很快就离开可以付费移除广告的页面。这样,至少留下了一部分愿意付费移除广告的用户。

这一次处理被拒,是少有的情况,反反复复多次提交多次被拒,屡战屡败!关键是开始不知道原因,后来搞清楚具体原因,但又不知道如何解决,所以,每次看到被拒的信息,心情都感到很无助,最后,在准备放弃时,却意外的审核通过了,而且,后续都一路绿灯!!!经历风雨,终见彩虹。这一过程,尤其是要从绝望中寻找希望的心情,从事开发多年来,这是第一次体验,值得记录,也希望在回味整个过程时,看能不能理出一些头绪来,或许有利于后续的开发。

一、多次被拒的过程

因为已经有多个app增加内购功能通过审核了,而且,在上线以后,也已经有用户进行了内购,只不过因购买页面启动太慢,用户点击“付费移除广告”按钮,毫无反应,不知所措。有用户还特意发邮件给我咨询情况,恰巧,我当时正在使用邮箱,所以,看到邮件后,马上回复:tap the button, and waiting… 让他点击按钮后等待,什么也不用做,静静等待,我在沙盒测试时就发现购买页面确实加载很慢。后来,用户发来邮件,说是购买成功了,第二天我也看到内购里有销售数据。虽然存在启动慢的问题,但购买过程还是可以完成的,而且已经有实际的购买产生了,代码应该没有问题吧。

所以,马上又完成了一个app的代码修改,除了内购产品ID需要进行修改以外,其余代码基本不用改,直接复制粘贴就可以,很快提交审核。但是,第二天收到一条New message,这是被拒的信息,确实很吃惊,看看原因,苹果的被拒信息如下:

Guideline 2.1 - Performance - App Completeness

We found that your in-app purchase products exhibited one or more bugs when reviewed on iPhone and iPad running iOS 14.7.1 on Wi-Fi.
Specifically, the app was not responsive when we tapped on “付费移除广告”

Next Steps

When validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead.

看到上面的被拒信息,我并没有觉得有什么事,想想,恐怕是审核人员比较着急,点击 “付费移除广告” 按钮后,没有耐心等待,就认为点击按钮无响应了。我知道这个情况,有时候需要一点时间来加载内购页面,因而,在解决问题中心回复:

When test the app with my iPhone, I tapped on “付费移除广告”,  I found I have to wait about a minute to get IAP server responsive, So, I think the IAP server’s responsive may be a little bit slow, you may need wait a minute. Please try…

希望审核人员再次审核,提示他点击按钮后需要等待,有时候需要等待一分钟。提交回复时还是比较有信心的,毕竟代码已经经过审核,肯定是没有问题的。很快,就得到了对方的回复,再次拒绝,理由如下:

Hello,
Thank you for providing information.

We found that your in-app purchase products exhibited one or more bugs when reviewed on iPad and iPhone running iOS 14.7.1 on Wi-Fi.
Specifically, the In-App Purchase was unable to load.

看样子审核人员,再次审核了app,但内购的购买页面还是不能加载。

怎么回事?首先,我对审核人员是不是有耐心等待一分钟表示怀疑,我觉得很可能不到时间,就不等了,然后就拒绝了。因此,为了解决购买页面加载时间长的问题,我增加了一个一分钟倒计时,也就是在用户点击 “付费移除广告”按钮后,进入60秒倒计时,如果内购页面在60秒内弹出,则倒计时结束,否则,等待60秒才结束。这样,我想应该可以很好的解决这个问题,信心满满的再次提交审核。

第二天早晨,看到手机的 New message 信息,知道又被拒绝了!,看看理由:

We found that your in-app purchase products exhibited one or more bugs when reviewed on iPad and iPhone running iOS 14.7.1 on Wi-Fi.
Specifically, the In-App Purchase was continue unable to properly load after 1 minute of loading.

Please see attached screenshots for details.

看到这个理由,确实有点失望,恐怕真不是我认为的那么简单,苹果审核人员,不但耐心等待了一分钟,而且,还给我附加了截图,告诉我,确实没有出现购买页面!

代码没有错误,我在沙盒环境下测试一切正常,但苹果审核却不出现购买页面,我怎么排查问题呢? 有点折磨人,想来想去也没什么好办法,但从我自己的测试来看,有时候第一次点击 “付费移除广告”按钮,等一分钟也不能弹出购买页面,但第二次再点击,往往在30秒以内可以弹出购买页面,因此,我决定录制一段视频,向苹果审核人员展示app在手机上的时间运行情况,包括:加载内购页面需要等待的时间,多次点击 “付费移除广告”按钮后,内购页面不同的弹出时间,以及完成一次购买的实际操作,足以证明app在沙盒环境下运行正常。录制一段视频提交给审核人员,应该也是一种常用的方法。上传视频后,我回复苹果审核人员,希望先看看视频,然后,可以进行多次点击。这一次,我还是有很强的信心,尤其是提交了视频,相信,一定能收到审核通过的信息!可是,让我极其失望的是,看到的信息,依然是 New message 信息,再次被拒绝!

Thank you for providing information.
Regarding 2.1, we found that your in-app purchase products exhibited one or more bugs when reviewed on iPad and iPhone running iOS 14.7.1 on Wi-Fi.
Specifically, the In-App Purchase was continue unable to properly load after multiple attempts with 1 minute countdown.

苹果审核人员经过多次尝试都没有看到弹出购买页面,而且每次都足足等了一分钟!

失望透顶!即便录制了一段视频,也没有出现什么转机,内购页面从来就没有在苹果审核人员面前弹出来过!失望之余,我也冷静的思考着。。。

二、终于找到原因,却不知如何解决

虽然,一时我也没想出什么好办法来,但有一点还是确信的,那就是代码是没有问题的,一是内购代码本身大都出自苹果,自己没有也不需要写什么代码;而是已经有多个app成功通过审核了,并且产生了实际内购。但,也正是因为这样,才更让我困惑,也不知道该怎么修改。既然,代码没有问题,那是不是测试环境的问题,如果手机的设置会不会有什么区别呢?我尝试在自己的手机上复原苹果审核人员所碰到的情况:内购页面从未弹出过。

围绕这一情况,我把手机的内购设置成 Don’t Allow,默认设置是 Allow。结果确实不能弹出内购页面,因为原来内购代码并没有任何提示信息,点击 “付费移除广告”按钮后,不会有任何响应。似乎完全复现了苹果审核人员的情况。但是,苹果审核人员会犯这种低级错误吗?不打开内购功能,来测试app的内购功能,应该不太可能。我也觉得这种几率很小,但我还有什么选择吗?就算几乎没有希望,也要尝试一下,万一是设置问题呢,因而,当不能发起内购时,增加一个提示信息。

还有什么可以做的吗?如果手机没有网络连接,那么内购页面也不会弹出吧。把自己的手机分别设置为飞行模式,关闭wifi网络和蜂窝数据,看看是什么情况,倒计时结束后,内购页面也没有弹出。为此,又加入网络检测的代码,有总比没有强,检测有没有网络连接,没有就弹出提示。

测试期间,还将手机Apple ID和沙盒测试的ID都注销,看看会发生什么情况,但正常弹出沙盒测试的ID的登录窗口,没有出现异常情况,不能复现问题。

再也想不出还可以增加点什么了,本着试试看的想法,也有一种侥幸的心里,如果真是这两种情况之一,那也就找到原因了,提交待审!

修改后点击 “付费移除广告”按钮代码如下:

-(IBAction)RemoveAdsPressed:(id)sender {

NSLog(@“(1)开始连接IAP服务器…”);

//在此加入是否有网络连接,没有连接就提示

NSString *product = productID;

if ([SKPaymentQueue canMakePayments]) {

[self requestProductData:product];

} else {

NSLog(@“不能内购”);

//在此加入不允许内购的提示信息

}

}

审核结果还是拒绝,我都有点习惯这个理由了。

Regarding 2.1, we found that your in-app purchase products exhibited one or more bugs when reviewed on iPad and iPhone running iOS 14.7.1 on Wi-Fi.
Specifically, the In-App Purchase was continue unable to properly load after multiple attempts with 1 minute countdown.

这个结果并没有出乎意料,苹果审核人员不至于在关闭网络和禁止内购的情况下,来审核app。

我想知道问题究竟出在什么地方,自己测试一点问题都没有,怎么才能得到苹果审核人员在点击 “付费移除广告”按钮后app发生了什么呢?自己测试时,可以在Xcode里看到NSLog的信息,请求过程一目了然。一想到这,我立刻有了主意,把点击 “付费移除广告”按钮后发生的一些关键信息,显示在屏幕上,这样,从苹果拒绝后附带的截图里,我就能看到这种信息了。说干就干,加一个TextView作为背景,把NSLog的信息按序号排列后,显示出来,这样就能搞清楚问题所在了。当然,为了让屏幕显示的内容更加自然一些,对输出文字进行了一些修饰,看上去更像自然进程,用户不至于感到不适,逐步逐行显示,一步一步的,与倒计时配合使用,反而显得自然,用户等待时会更耐心一点。对于这一思路,自己很满意,关键是能让我知道发生了什么导致无法加载内购页面。

代码很快就修改好了,在屏幕显示的关键信息如下:

- (void)requestProductData:(NSString *)type {

//

NSLog(@“(2)请求产品信息“);

NSArray *product = [[NSArray alloc] initWithObjects:type, nil];

NSSet *nsset = [NSSet setWithArray:product];

SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];

request.delegate =  self;

[request start];

}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

//

NSLog(@“(3)收到产品反馈消息");

NSArray *product = response.products;

if([product count] == 0){

NSLog(@“(4)没有商品退出");     //问题在这里

return;

}

NSLog(@“(4) 获得产品ID");

NSLog(@“(5) 产品数量大于0“);

SKProduct *p =  nil;

for (SKProduct *pro in product) {

NSLog(@"%@", [pro description]);

NSLog(@"%@", [pro localizedTitle]);

NSLog(@"%@", [pro localizedDescription]);

NSLog(@"%@", [pro price]);

NSLog(@"%@", [pro productIdentifier]);

if([pro.productIdentifier isEqualToString:productID]){

p = pro;

}

}

SKPayment *payment = [SKPayment paymentWithProduct:p];

NSLog(@“发起购买请求”);

[[SKPaymentQueue defaultQueue] addPayment:payment];

}

关键是第4个显示的信息,如果发生错误,第4的显示结果是:(4)没有商品退出,正常情况第4的显示结果是:(4) 获得产品ID。

提交审核,为了确保得到带有信息的截图,特意在备注里给审核人员写了一份较为详细的说明,同时,也让其了解我所进行的一些尝试。内容如下:

Thanks for your multiple attempts with 1 minute countdown, sorry for make you trouble.

To fix the issue, I’ve tried the following:

(1)  I guess the issue may be caused by  the IAP loading time, app connect IAP server may need more time,   I add  1 minute countdown for IAP loading, but your multiple attempts with 1 minute countdown Show it did not work.

(2)I sign out my Apple ID and Sandbox account Apple ID, run the app, it will ask me Sign in with Apple ID (Sandbox account) and password, then IAP load normally, which can not reproduce the issue.

(3)  I try to reproduce the issue, change my iPhone’s setting for In-App Purchase to Don’t Allow, After multiple attempts with 1 minute countdown, I did reproduce the issue, IAP did not load. So, I add some code: Show AlertView if iPhone did  not allow IAP. Also, it did not work, your iPhone and iPad did not show the AlertView.

(4) I turn on Airplane Mode or turn off Wi-Fi and Cellular Data, also I reproduce the issue, IAP did not load, So, I add some code to check the network setting, but It seems not work too, your iPhone/iPad’s Wi-Fi surely works fine.

The new build, try the following:

I try to get some message to show me what happened in your iPhone/iPad after the button of “付费移除广告” tapped, I add a TextView to show the debug output,  same as the output I see in Xcode. Could you help me, I hope you attach the screenshots with debug output message, it’s important for me to fix the issue.

Thanks a lot again.

提交审核以后,静等审核结果,也期待看到新的截图。

第二天一早,看到拒绝的信息,看到截图,问题就十分清楚了。苹果审核人员特意附带了中文和英文截图,内购请求得到的产品数量为0!

截图1

截图2

问题确实搞清楚了,可为什么在苹果审核时会出现返回产品数量为0的情况,我能做什么呢?

首先,想到搜索有没有类似的情况,在苹果开发者论坛就有类似的情况发生过,帖子的标题是:In app purchase problem during the review。有回复存在同样问题的,也有回复解决问题的,比如:

I could fix the issue now! I did two things but unfortunately can not tell which one actually solved the problem:

* I learned that Apple introduced some new contact information requirements silently in App Store Connect "Payment / Tax / Banking" section. I added all the required information until everything looked green again.

* I submitted a new build compiled with Xcode 11.1 GM.

我检查了银行协议税务等信息,没有问题,是Active,也没有任何告警信息。显然,我的问题与这无关。看完全部回复,哪怕是一点毫无希望的线索,我都要检查核对与我的情况是否相符,可惜,没有任何可供继续做下去的线索。

还有一篇教程,题目似乎很符合,标题是:

Zero In-app purchase products returned? Here's a checklist on troubleshooting it

里面列出了13步检查法。尽管该教程主要是针对自己的手机测试时得到0产品返回,与我的情况不太符合,我也认真按照13步法则,一步一步核对,同样,没有发现什么线索。

当然,我也不是什么都没做,苹果审核产品返回为0,会不会是内购产品设置的问题,为了排除这一可能,我登录到 iTunes connect,把这个app的已经创建好的内购产品删除,重新创建一个内购产品,一切都重新设置一遍,自己测试好以后,提交审核,并且备注信息:

From the attached screenshots, the issue is Product Count = 0.  It should be Product Count = 1.

I sign in iTunes connect, Create an new In-App Purchase Product, I hope this will fix the issue.

Thanks very much.

除了失望,还是失望,这一办法并没有解决这个问题,拒绝理由还是:

Specifically, the In-App Purchase was continue unable to properly load after multiple attempts with 1 minute countdown.

三、最终通过审核,但原因仍然不明

什么办法都没有了,黔驴技穷,无计可施,束手无策,实在不行只能放弃,去掉内购,返回其本来的状态,可又不甘心,还想做一下尝试,再三考虑之下,我在问题解决中心回复:

I spend almost a whole day to figure out the reason or any clue to the issue, but got nothing. Do you have another iPhone? If you do, could you try to review it with the new iPhone?

希望审核人员换一台手机试一试,这应该算一个不合理的要求,因为,苹果审核是用iPhone和iPad分别测试的,每次截图也都是iPhone和iPad各截一张图,实在没办法,这是我能想到的唯一的办法了。

周五,近午间时间,手机弹出一条Apple的审核信息,打开一看,

Hello,

Call Ticket: ……

We have been trying to reach you at +86 ……… to discuss the review results for your app, and have been unsuccessful on the number we have in our systems.

Please provide a telephone number and time that you can be reached so that we may attempt to contact you again.  Once I receive your phone number, I will contact you at my next available opportunity.

Alternatively, please feel free to contact me at +1- ……… Monday through Friday between 11AM-8PM Pacific Daylight Time so we can discuss your app.

Best regards,

原来苹果审核人员给我打过电话,但我没有接到,看到手机上有一个来自米国的未接,有点遗憾,我也很希望跟审核人员讨论一下。看样子,他也不太同意我希望他换手机审核的要求。我想给他打过去,可一查时间,已经过了他可以接听电话的时间了,只好回复信息,希望周一他可以再次给我打电话。

到周日下午6点左右,我觉得应该再做一次努力,不管他换不换手机,都应该再提交审核一次,如果再不行,就放弃算了。

把代码又检查整理一遍,安装测试一切都正常,打包上传,提交审核,心情非常平静,我觉得已经尽力了!

第二天一早,看到“可供销售”的信息,通过审核了!百感交集,最希望的还是能接听到审核人员的电话,但。。。

我记得当时搜索有关问题的时候,看到一个开发者发了一个求助的帖子,与我的情况差不多,虽然,帖子回复本身看不到任何有效解决办法,但这个开发者最后的回复,有resubmit and finally approved的词汇,让我印象深刻,我感觉我的情况、心情与结果都跟他差不多啊!!!

iOS开发 - 内购沙盒测试正常,因产品返回数为0被苹果审核多次拒绝 (In-app purchase products return 0)相关推荐

  1. Ios11 IphoneX 内购沙盒测试 无限弹登录框问题解决

    最近升级了iOS11的,经常遇到内购沙盒测试的时候,发现输入沙盒账号密码之后,居然又弹出了登录框,之后便是循环弹登录框,刚开始还以为是代码问题,后来发现了是ios11升级后沙盒测试的问题. 下面有几种 ...

  2. 直播平台开发时iOS 开发内购功能,直播平台源码搭建

    1.首先登录苹果账号,在直播平台源码搭建完成好后,进入后台管理中心添加商品,选择功能----App内购买项目------添加商品类型.商品的ID.以及说明信息. 2.在直播平台源码搭建后台创建沙盒测试 ...

  3. iOS开发·内购流程

    2019独角兽企业重金招聘Python工程师标准>>> 说明: 涉及到金额交易,苹果审核的一般严格许多.苹果在涉及需要支付中间币的购买必须走苹果内购(例:点券.钻石.K币等等),若是 ...

  4. iOS开发内购图文教程

    2015年最全的内购图文教程,首先是填各种资料,最后是代码,废话不多说,直接上图 ======================第一部分协议=============== 第一步.png 第二步.jpg ...

  5. iOS开发内购详细版本说明

    转自:http://www.jianshu.com/p/c252b2ccb078 一.最近公司很多的项目用到了内购,抽空整理下内购的详细内容吧. 1.先从内购的iTunesConnect里配置说起吧, ...

  6. iOS打开沙盒html,ios 开发中,沙盒目录解释

    在iPhone的沙箱模型有四个文件夹,分别是documents.tmp.app.library. 创建文件的时候会先创建文件的路径,方法如下: 1.Documents:这是文档目录.有关应用的所有数据 ...

  7. iOS开发内购零丢单问题

    苹果能够的零丢单操作 文章的主要内容 内购分析 观察者代码构建 着重所以下finishTransaction方法的处理 文章的主要内容 你好!这是我发表的第一段关于苹果技术的博客,如果有说的不对的地方 ...

  8. iOS开发之内购完全笔记(您已购买此 App 内购买项目。此项目将免费恢复。)

    1.内购流程 1.在 AppStore 中创建相应的物品,创建内购沙盒测试账号 2.客户端从后台获取相应的物品 ID (当然也可以再客户端写死,但后期扩展性就受限制了) 3.依据相应的物品 ID 请求 ...

  9. ios 获取沙河文件夹_iOS开发之获取沙盒路径

    iOS开发之沙盒机制(SandBox)详细讲解了沙盒的一些机制.在开发中,我们需要对沙盒进行操作,所以我们需要获取到沙盒路径. 沙盒里的文件夹包括Documents.Library.tmp.这三个文件 ...

最新文章

  1. vue 2.0 filter html,vue.filter使用方法是什么
  2. mxnet pick挑选
  3. Java方法中的参数太多,第3部分:构建器模式
  4. Inclavare Containers:云原生机密计算的未来
  5. 获取朋友圈照片_朋友圈可以发 30 秒视频啦!用微视这个新功能就能办到
  6. jdk卸载不干净怎么办_【实用】流氓软件卸载不干净?
  7. 图形化界面工具 SQLyog
  8. [JS基础] 之类型判断
  9. 5.26 考试修改+总结
  10. 大数据工程师的简易解释
  11. 本科计算机技术与应用知识点,《软件工程》经典考试例题题,重点的知识点(含答案)...
  12. pdf文件插入电子签名
  13. DOSBox指令全 汇编指令大全 debug
  14. 高效算法:竞赛、应试与提高必修128例
  15. HTML记事本滚动字幕怎么弄,滚动字幕怎么用word做 如何用WORD制作滚动字幕
  16. 6代cpu装win7
  17. Proteus 8 Professional 仿真软件安装包和汉化
  18. 使用Scrapy框架爬取88读书网小说,并保存本地文件
  19. json格式的数据转化为字符串
  20. 全网首发,大众奥迪领驭帕萨特DIY数码碟盒增加USB和蓝牙播放音乐功能使用原车接口无损改装

热门文章

  1. sa登录时的各种错误
  2. 三星 c5 html,【三星GALAXYC5评测】三星Galaxy C5评测:PK国产的正确姿势_三星 GALAXY C5_手机评测-中关村在线...
  3. UniGui iconCls字符图标的引用
  4. 在蚂蚁森林把逝去的能量抢回(Python实现)
  5. 边缘计算简述-多视角下的边缘计算实现
  6. 如何制作多途经点的线路导航——驾车篇
  7. 书稿《C++释难解惑》(C++130个问题)已上传到CSDN,欢迎下载
  8. 什么叫精通C/C++(CSDN回帖语录)
  9. Android音频录制--AudioRecord
  10. 续Gulp使用入门三步压缩图片