苹果内购(IAP)填坑记

前言

目前有很多关于iOS内购帖子及开源项目,但是没有一个相对合适自己项目的,所以就多研究下.主要还是因为苹果的IAP太坑了,所以笔者自己基于目前网上的部分代码以及平时项目的BUG反馈封装了一套内购方案和大家分享探讨.

内购的坑

其实苹果的IAP还是做了很多操作了,但是现实用起来发现还是有很多坑爹的地方,防不胜防.由于自己项目须在IAP进行前就需要获取一个自己服务器的订单才能进行IAP购买验证,所以会出现以下几个问题:

  1. 用户购买,IAP无回调响应,用户退出程序导致定单异常.
  • 原因:用户虽然点击了购买就储存了订单,但是还没有进入了苹果的内购队列,所以用户退出后再次进入本地就会有个僵尸订单,无法清除.所以储存订单应该在
  • 解决办法:SKPaymentTransactionStatePurchasing时才储存.
  1. 用户完成苹果购买,自己的服务器网络发生错误,无法及时到账.
  • 原因:一般是因为在SKPaymentTransactionStatePurchased后就结束订单了,自己的储存方案有异常.
  • 解决办法:在没有自己服务器得到验证订单状态前就不finish订单,程序再启动或者再次监听IPA时苹果会再次通过

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction
回调未结束的订单,即使重新安装程序也会有回调.

  1. SKPaymentTransaction.applicationUsername丢失,程序崩溃.
  • 原因:applicationUsername丢失的问题相信很多开发者都遇到过...苹果坑逼.
  • 解决办法:通过对比UserID以及productIdentifier来确定一个以前在SKPaymentTransactionStatePurchasing时储存的订单.看似有点问题,但是因为苹果的交易是串行的,如果自己验证也是串行验证,那么通过UserID和productIdentifier就能确定为同一个订单了.
  1. 用户卸载程序导致本地订单号丢失.
  • 原因:购买订单时的数据存储在本地,删除应用就丢失.
  • 解决办法:通过储存在keychain里面防止丢失.
  1. 获取本地苹果票据为空.
  • 原因:有可能删除应用后重新安装,这个时候本地票据可能是空的,导致验证失败.
  • 解决方法:通过SKReceiptRefreshRequest刷新票据得到最新的苹果票据.

由于内购的地方很多,为此封装了一套JKIAPHelp用于快速接入.

JKIAPHelp基本逻辑:

  1. 用户注册后,开始购买商品,把自己服务器上的订单号传给JKIAPHelp.
  2. JKIAPHelp在系统支付回调

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction

SKPaymentTransactionStatePurchasing时将订单相关信息(订单号以及物品价格)加入到钥匙串中保证订单信息的完整性与可靠性.

  1. 在SKPaymentTransactionStatePurchased的时候来验证订单.验证是通过开发者实现JKIAPHelp代理

-(void)verifyWithModel:(JKIAPTransactionModel *)model resultAction:(VerifyRsultBlock)resultAction

来向开发者自己的服务器完成订单的验证.(开发者通过调用resultAction回调服务器验证状态).

  • 如果验证出现失效或者完成,那么就判断当前的用户是否和创建订单时候的用户一致,如果一致那么久删除钥匙串里对应的订单完成购买,不一致的话就将状态同步到钥匙串里,当下一次用户注册时通过补发货的回调来通知开发者.
  • 如果服务器验证网络错误,就同步钥匙串订单状态.当用户点击购买,从后台进入程序,重新注册JKIAP时就会检测当前未完成的订单,将未完成的订单再次验证,如果再次发生错误就下一次再验证,有多个未完成的话就继续验证下一个订单.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354