博客> iOS 内购
iOS 内购
2019-08-18 21:18 评论:0 阅读:923 李小超
ios 内购

原文地址: http://www.jianshu.com/p/ecc4f53a83c8 在(一)中坑已经说的很多了,但只埋了一半.现在我把我意识到的坑都埋完. 没看过(一)的出门左转,这俩要一起看..抱歉篇幅问题

↓防懵逼必看 iOS内购你看我就够了(一)

↑防懵逼必看 回去看了看貌似(一)已经可以解决所有问题了...额

1.还有订单没结束的坑 所以要把开始监听写在程序入口,在程序挂起时移除监听. 如果有未完成的订单他就会直接走

  • (void)paymentQueue:(SKPaymentQueue )queue updatedTransactions:(NSArray )transactions 一般情况下都是购买成功后没有结束订单的坑,所以他会走验证方法

if (self.cash != nil)这句话在这就起作用了,所以他会走[self checkUnTestReceipt];//从本地取凭证验证去 } 2.为什么要存到数组?? 因为你可能出现不止一个未验证的订单,擦,好惨

  • (void)checkUnTestReceipt { NSArray payAry =从本地去取存凭证的数组,我就不告诉你怎么取,咬我 if (!payAry || payAry.count == 0) { return; } for (NSDictionary dic in payAry) { [self untestReceiptByTime:dic];//把本地(漏单)的dic(验证信息)都去验证了 } } untestReceiptByTime:这方法只是多了个失败后的回传,和验证方法有一点不同

  • (void)untestReceiptByTime:(NSDictionary *)dic//第一次访问服务器失败了又一次请求,多了个定时的请求 { WEAKSELF; [[YLBNetWorkManager sharedInstance]postJsonData:dic url: e successBlock:^(id responseBody) {

    [weakSelf removeDicFromPayAry:dic];//移除,不懂得看一

    } failureBlock:^(NSString *error) { DLog(@"%@和自己服务器失败22",error); [self untestReceiptByTime:dic];//最好一段时间后再验证,用GCD } 程序入口监听开始

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

DLog(@"我一进来就看看本地漏单"); [[IAPManager sharedInstance]checkUnTestReceipt];//一进程序看看有没有漏单 双管齐下,你慢慢漏吧

当然还得在程序入口新建本地数组(只建一次),用NSUserDefaults ,删除添加都是他,这我就不写了,你全部都复制粘贴也没啥成就感..

程序出口移除监听 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; .

3.为什么必须存到本地 为了不往本地存我是没少费劲,但是我太年轻,还是错了. 虽然只要不结束订单凭证就不会消失,但是验证时还需要其他(用户Aid,不然你怎么知道谁买的.或者下次登录换用户B了,你只用了本地的凭证和B,擦,充错人)所以必须存本地. 突然有个疑问,这个凭证是怎么和订单一一对应的?谁知道说下,我没事也研究下

4.总结 貌似无法解决用户购买后未验证但是换手机了的丢单问题,额,你找客服吧.好烦..技术有限,以后再说吧.仔细想想好像还不是很完美.以后再补充吧.也请大神们多指教吧 最后我要感谢所有帮助我的人谢谢你们五四的奉献

... 写到这里,算是把内购给写的略微明白点了.我现在也就能理解到这个水平了,以后有什么会再补充. 记得刚拿到任务一脸懵逼头大.貌似大部分内购文章里都有我浏览的身影吧.我针扎 我在想要不要加密本地的东西,还有唐巧说要禁止越狱的用户内购(他们问题太多,比如被黑客挟持)

收藏
0
sina weixin mail 回到顶部