美文网首页ios积累留着看
消耗型和非自动订阅型苹果内购(IAP)优化

消耗型和非自动订阅型苹果内购(IAP)优化

作者: iDeveloper | 来源:发表于2017-07-02 20:24 被阅读249次

最近项目内购,每天有用户反馈无法进行内购或者付款成功后商品未到账的情况,于是进行了分析优化.


分析

  • 无法进行内购问题
    原因是在从苹果服务器请求产品信息失败导致的.
    通常返回错误提示:无法连接iTunes store.(沙盒环境)
    即下面请求失败.
 SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers];
productsRequest.delegate = delegate;
 [productsRequest start];

该问题苹果服务器原因,无解中.(T_T)
但是我们可以曲线救国使用废弃api创建SKPayment进行购买.(亲测可用)

+ (id)paymentWithProductIdentifier:(NSString *)identifier NS_DEPRECATED_IOS(3_0, 5_0, "Use +paymentWithProduct: after fetching the available products using SKProductsRequest");
  • 付款成功后,虚拟币或者会员未到账
    原因是没有和我们的服务器二次验证成功.
    主要有以下两种可能性:
1 . 苹果扣款成功回调后,因为我们服务器或者网络原因等导致二次验证失败.
2 . 苹果扣款成功后,没有进行正确回调.

曾经苹果服务器有两天抽风,导致我们IAP全部失败,奇怪的是别人的虽然也回调失败,但是还是能成功购买.

优化

针对第一种可能:

  • 与我们服务器进行二次验证失败的时候,不能完成苹果订单.(wwdc有强调,消耗型)
    即不要对这个transaction调用以下代码:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

后续再进行二次验证成功后在finishTransaction.

  • 灵活进行二次验证
// Only valid if state is SKPaymentTransactionStatePurchased.
@property(nonatomic, readonly, nullable) NSData *transactionReceipt NS_DEPRECATED_IOS(3_0, 7_0, "Use -[NSBundle appStoreReceiptURL]");

iOS7新方法获取的transactionReceipt在多次进行内购后,会变大,甚至达几百KB.
iOS6老方法获取则小很多,只有几KB.
先尝试用iOS6的transactionReceipt进行验证,失败后再用iOS7的transactionReceipt进行验证,以提高二次验证的成功率.

针对第二种可能:

  • 检查购买队列中是否有购买成功但未完成二次验证的transaction
    [SKPaymentQueue defaultQueue] .transactions里面.(该属性不支持KVO)
    1 . 主要在进入含有内购页面时候进行检查.例如购买虚拟币页面.
    2 . 苹果内购addPayment后,定时3~5秒进行检查,以防苹果没有进行正确回调.

其他优化:

  • 不要尝试保存失败信息,维护起来非常困难.(因为内购的容易失败)
    如果有需要将我们的订单和内购交易在购买未成功之前就建立关系,可以利用SKPaymentapplicationUsername属性,来保存我们的订单号或者用户id信息.
    介绍如下:

An opaque identifier for the user’s account on your system.
This is used to help the store detect irregular activity. For example, in a game, it would be unusual for dozens of different iTunes Store accounts making purchases on behalf of the same in-game character.
The recommended implementation is to use a one-way hash of the user’s account name to calculate the value for this property.

  • 建立对成功二次验证SKPaymentTransaction的transactionIdentifier的缓存机制.
    进行二次验证前判断缓存,以防重复的二次验证.(注意在合适的时候清空缓存,例如队列中没有购买成功的SKPaymentTransaction)

上线后,再来更新优化后的效果... C U around.

相关文章

  • 上线苹果自动续期订阅IAP注意事项

    苹果App内购项目分为4类:消耗型项目、非消耗型项目、非续期订阅、自动续期订阅。自动续期订单在用户提交订阅后,苹果...

  • 消耗型和非自动订阅型苹果内购(IAP)优化

    最近项目内购,每天有用户反馈无法进行内购或者付款成功后商品未到账的情况,于是进行了分析优化. 分析 无法进行内购问...

  • 苹果内购

    一、内购支购买项目类型: 1.消耗型商品2.非消耗型商品3.非续期订阅4.自动续期订阅 苹果官方网址:https:...

  • iOS内购总结

    内购类型有四种: 消耗型商品,非消耗型商品,非续期订阅,自动续期订阅. 其中最有难度的就是自动续期订阅的实现,开通...

  • iOS内购:自动续期订阅总结

    前言:内购类型有四种:消耗型商品,非消耗型商品,非续期订阅,自动续期订阅. 顾名思义,从中最有难度的就是自动续期订...

  • ios 内购成功验证流程

    Apple中的productID类型包括:消耗型项目、非消耗型项目、自动续期订阅、非自动续期订阅项目。 消耗型项目...

  • ios内购注意事项

    内购两种方式 ios内购及一些常用的破解手段 iap内购破解原理 苹果官方内购demo 内购的消耗性和非消耗性购买说明

  • iOS开发内购(In-App Purchase)总结

    流程梳理 一、内购类型介绍 这四种内购,使用过消耗型商品以及自动续期订阅类型,接入方式以及验证方式基本一致,自动续...

  • 2022 iOS 内购详解最新最全In-App Purchase

    学如逆水行舟,不进则退。 今天和大家来聊聊iOS内购即In-App Purchase,内购分为消耗型、非消耗型、自...

  • iOS内购非自动续期订阅 应用内支付 IAP非自动续期订阅 消耗

    简介 本篇文章是根据一些网友建议,把IAP非自动续期订阅部分从《IAP自动续期订阅》抽离出来,方便更多的有需要的朋...

网友评论

  • 超_iOS:消耗型和非自动订阅型 的验证逻辑都是一样的吧?都是只用购买凭证吧?
    iDeveloper:@_超 是的
  • 谢谢生活:第二次验证报错 status = 21003;或者 status = 21002;我们两个app都有支付,第一个验证成功,第二个完全是一样的操作可是就是不行,我也是郁闷啊。
    iDeveloper:@谢谢生活 哦哦:fist:
    谢谢生活:@MrLittleWhit 知道原因了,订购性的要加个password,非订购的不要。我忘了加password这个参数。用的chorme自带的翻译,所以看官方文档一知半解,自己把自己坑了,一看原文,在酌句翻译就没得问题的。我日。
    iDeveloper:@谢谢生活 可以试试不走服务器,直接手机发请求到苹果服务器进行二次验证,看看能不能成功

本文标题:消耗型和非自动订阅型苹果内购(IAP)优化

本文链接:https://www.haomeiwen.com/subject/rihocxtx.html