IAP(苹果内购) 备忘录

下面这些内容是我自己的开发经验以及从网上看来的内容。有不对的地方,以及如果有更好的补充,欢迎在下方留言。

备忘

  1. 有四种 IAP 类型,消耗型、非消耗型、自动续订,非自动续订

  2. 在 itunesconnect 网站上新建一个购买项之后,后面如果把它删了,这个购买项的 product ID 没法复用

  3. 消耗性的用户购买之后会生成一个 receipt,这个 receipt 会一直保存到用户下一次购买,用户再次购买,该凭证被刷新,之前购买的凭证无法找到了。

  4. 消耗性的用户退款之后没有 cancellation_date 字段,也就是说无法知道用户是否退款

  5. 自动续订的购买方式可以把 支付凭证想象成一个 token,如果用户退款(refund),服务器拿这个凭证去苹果校验的时候,苹果通过设置 cancellation_date 的方式告诉服务器用户取消订阅了。

  6. 非消耗性和不自动续订的订阅如果用户退款,服务器拿这个凭证去苹果校验,苹果不会设置 cancellation_date 告诉你用户退款了。
    这种情况如果想知道用户是否退款,需要 app 本地使用 SKReceiptRefreshRequest 或者 restoreCompletedTransactions 来刷新凭证,然后将凭证传给后台,后台拿着新的凭证找苹果校验,此时退款的用户会返回带 cancellation_date 的解码凭证。

  7. 上述刷新凭证的方式最大的问题是每次刷新都会触发 iOS 系统弹出它自己的一个登录框,要求用户输入 Apple ID 的帐号密码。所以苹果建议不要自动刷新凭证,在界面上放一个 restore 按钮,用户点击之后再去触发。

  8. 想通过刷新凭证来知道用户是否退款比较难,因为系统弹出的 Apple ID 登录框用户可以点击取消不登录,这时,无论如何也不可能刷新凭证了。当然下次购买或者卸载重新从 AppStroe 安装是否会刷新这个凭证存疑。

  9. iOS7 及以后的系统下载 app 会带有 appStoreReceiptURL 文件,但是 Xcode 开发 cmd+r 跑起来的以及其他途径安装的 app 很可能没有这个文件,需要刷新。

更正:iOS7 以上的系统下载 app 在没有购买过的情况下不会有这个文件。

  1. 不自动续订这种方式无法在苹果的 itunesconnect 网站上设置过期时间,提醒用户购买有效时间可以在购买项的名字里面写上去,所以设置过期时间需要开发者自己维护。通常来说设备上的时间戳是无法信任的,所以最好搞一个服务器来维护。

  2. 内购无法设置任意金额,只能设置网站上给的那几项。

  3. 测试没有通过审核的内购的时候,如果通过非沙盒用户的方式,每次测试都会失败,说连接不上 iTunesStore,这时,你需要去申请沙盒用户,用这个用户来测试。

  4. 非消耗性的沙盒测试,如果你买过了,下次测试的时候直接就付款成功了,没法再次测整个购买流程,所以需要重新搞一个沙盒测试帐号。

  5. 有些邮箱可以提供别名的功能,如果要建一个沙盒测试帐号,可以使用别名而不是每次都真的去创建一个新的帐号。

  6. 越狱设备就不要考虑 IAP 了,因为现在越狱设备很少了。

  7. 内购的 restore 只支持非消耗品和自动续订,另外两个,消耗性和非自动续订不支持,其中非自动续订的 restore 可以依靠开发者自己来维护。

  8. SwiftStoreKit 这个库的 completeTransactions 方法针对的是 pending transtraction,使用 purchase 相关的 api 不会触发这个 completeTransactions 的回调。

  9. 如果觉得 IAP 难用,是的,没错,之所以难用是因为苹果为了保护用户隐私和苹果自己的数据。我们能做的就是信任它。

  10. applicationUsername 这个东西无法给你想要的。但是苹果在文档里面说这个可以防止欺诈等行为,所以能用就用,传入用户ID 的 hash 就行。

  11. 在添加了 observer 之后,如果有未完成的 transaction,那么 paymentQueue:updatedTransactions: 会被调用,但是如果在这个方法里没有 finishTransaction 的话,这个函数会一直等到下次启动添加 observer 的时候才会被调用。所以为了避免等待下次启动才去 finishTransaction,可以通过不断的观察 SKPaymentQueue.default().transactions 的值来按需 finish。

  12. 如果一笔交易没有调用 finishTransaction 这个函数,那么对于同一个 product id 的购买,iOS 系统会提示已经购买过,并为用户免费恢复。同时,不会再次回调 delegate (存疑,我用的是 SwiftyStore,回调闭包没有执行)。这种情况需要在 app 发起购买之前判断是否当前有同样的一个 product id 的未完成订单,并在必要情况下给予 finish,不需要再重复发起购买了。

  13. 用户购买 app 以后(无论是付费购买还是免费的),iOS 就会生成一个凭证放在 appStoreReceiptURL 路径中。

  14. app 发起了购买,然后 kill 掉 app,此时用户完成付款,那么虽然你可以拿到苹果告诉你的未完成的交易,但是在这笔交易发生的时候产生的其他公司业务相关的信息就找不到了。所以,最好在购买发起之前存储这些信息。

引用

  1. In-App Purchase FAQ
  2. refreshing-ios-app-receipt
  3. In-App Purchase Programming Guide
  4. Receipt Validation Programming Guide
  5. In-App Purchase Tutorial: Getting Started
  6. SwiftyStoreKit
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345