Lei's Blog

iOS内购漫漫审核路

写在前面的话

路漫漫其修远兮 吾将上下而求索…
因为今年有生宝宝的打算,而我上班的地方在南京西路,上班有点远,所以就打算换家张江这边的公司,年前面了三家,第一家沪江,面试的时候准备不是很充足,卡在了算法及架构方面的知识上了,第二家360旗下的360医药,面试了4论,最后面CTO面,未知原因卡在了这里,第三家一家小的创业公司,拿到offer年后入职,过了年之后我才发现,坑,大坑,乃至天坑,公司从17年6月份到现在没有更新过一次版本,项目写的真是无力吐槽,各种汉字命名,各种不知何种用意变量存取,卡顿,崩溃。。。。
扯远了^^因为公司项目是关于足球足彩的,所以之前一直隐藏了三方支付功能,然后之前的开发者一直头铁,不做处理,导致后来提审一次需要20天至一个月的等待,我三月份入职之后本是想放弃之前的代码,重构,但是看着老板那着急的眼神,以及即将到来的世界杯,所以就决定在之前项目基础上把三方支付去掉改为内购试一次。此为前话。

内购准备工作

苹果内购对于开发者和使用者来讲,都不算是一种友好的交互方式,更别提苹果爸爸百分之三十的抽成,以及不可随心所欲的定价。首先我们要了解内购的原理,然后就是做好内购前的准备工作,由于网上教程很多,在这里我只记录流程,和应该注意的地方。
为了更好的了解内购流程,我画了一张图,哎呦在mac上用触控板画图真的是费了老鼻子劲了,将就着看吧

注意这里有个地方需要着重说一下

执行第6步之后,苹果已经将购买凭证发送到本地,此时我们需要将购买凭证存贮到本地,以防止将凭证上传给服务器,或者服务器下发支付结果时出错。

1
2
3
4
5
6
7
8
9
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if (!receipt) { /* No local receipt -- handle the error. */
[SVProgressHUD showSuccessWithStatus:@"本地数据不存在"];
return;
}
NSString *base64_receipt = [receipt base64EncodedStringWithOptions:0];
[ArchiveFile savePurchaseProof:@{@"base64_receipt":PARAM_IS_NIL_ERROR(base64_receipt), @"orderID":PARAM_IS_NIL_ERROR(self.orderID), @"amount":PARAM_IS_NIL_ERROR(self.amount)}];
  • 存储代码在这里 “In_App_Purchase_Path”为指定路径及文件类型
    + (BOOL)savePurchaseProof:(id)proof {
      NSMutableArray *recordArray = [ArchiveFile getDataWithPath:In_App_Purchase_Path];
      [recordArray addObject:proof];
     return [ArchiveFile saveDataWithPath:In_App_Purchase_Path data:recordArray]; }
    
  • 当程序启动的时候先取出本地的购买凭证,如果有,则用后台线程遍历去验证.

    内购中另外一个需要注意的地方就是设置商品的类型,先放一张图给各位了解一下

    • 我们第一次被拒

      此处有一句MMP不知当讲不当讲,苹果爸爸找都懒得找,直接给打回了,于是乎,我就赶紧录了一个视频上传,然后用中文回复,然后期待着。。。

      188元使用7天和18元解锁本场的商品入口我们在附加文件里添加了视频演示,如果有问题请尽快联系我们,谢谢.

    • 果不其然,第二次被拒来了

      这就是上面我提到的,一定要找准属于自己的商品类型,此处苹果建议哦不对是要求我们18元解锁本场,不应该使用非续期订阅,而应该使用非消耗性产品,并且有一点比坑的是敲黑板了啊(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)简言之就是创建过的产品不可更改,且产品ID不可在用。这尼玛,于是乎按照苹果爸爸要求重新定义产品类型,<并且我想在我们的产品推荐中也有单次购买,应该也是非消耗性,然后我就悄悄的也改成了非消耗性>,并将产品ID发给后台更换,重新部署到线上,打包上传,开始了又一次的期待。。。

    • 在这里有一点很欣慰的是,之前一次提交需要等二十天至一个月,而这次隔天就有消息了,但是是被拒的消息。

      这这这这。。。。。。这就尴尬了,本来之前定义的就是消耗性,上次被拒我把单场购买都统一改成了非消耗性然鹅。。。哎都是泪,赶紧改回来,并且之前的产品ID又不可用了,只能重新定义,重新给后台更换部署。。。并且还赔上两杯一点点。并且把老夫那蹩脚的英语都给逼了出来了,给苹果的回复如下.

隔天一大早醒来赶紧打开itunesConnect,(Pending Developer Release)简直两眼泪汪汪呀。时隔10个月之后公司的产品在次上线这次内购的上线心的就是要与苹果建立起良好的沟通,并且按照他的要求,切不可硬着头皮去挑战人家的极限。