iOS内购你看我就够了(埋坑篇)

在(一)中坑已经说的很多了,但只埋了一半.现在我把我意识到的坑都埋完.
没看过(一)的出门左转,这俩要一起看..抱歉篇幅问题

↓防懵逼必看

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.总结

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

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

5 更新11.1(验证)

先去苹果的正式服务器验证,返回21007的话再去测试验证.因为苹果测试用的是测试服务器

你可能感兴趣的:(iOS内购你看我就够了(埋坑篇))