应用内购买错误

时间:2016-01-13 11:03:02

标签: ios in-app-purchase storekit

我正在开发一个iOS应用程序,用户可以通过应用内购买购买额外的功能。我已经让应用内购买和恢复正常运行,我将boolean保存到NSUserDefaults,说明他们是否已成功购买或恢复购买。

然而,如果用户1在手机上购买应用内购买,则会出现一个错误,然后登录到用户2手机上的App Store并恢复购买。然后再次注销并允许用户2重新登录,这意味着用户2仍然可以免费解锁应用内购买,因为boolean中的NSUserDefaults仍然设置为真。

我试图找到一种方法来查询用户的App Store电子邮件或其他方式来检查用户的App Store电子邮件是否与他们购买的电子邮件相同。但这需要在本地完成,因为用户可以在没有任何互联网连接时使用此功能。

有没有人对我如何做到这一点或任何更好的做法有任何建议?

谢谢

2 个答案:

答案 0 :(得分:1)

不幸的是,这是设计上的,所以旧的格言“它不是一个错误,它是一个特征”。

它的设计是这样的,因此拥有多个设备(例如iPhone和iPad)的用户可以在第一台设备上进行购买,并通过在其他设备上恢复购买而获益。

当然,这为人们在其他人的设备上分享购买打开了大门。正如您所描述的那样。

好消息是SKPayment上有一个名为applicationUsername的属性,其目的是作为文档说明......

  

使用此属性可帮助商店检测不规则活动。例如,在游戏中,几十个不同的iTunes Store帐户代表相同的游戏角色进行购买是不常见的。

如果您没有任何唯一标识用户的信息,例如一个电子邮件,用户名,身份证等等你的问题无法解决我很抱歉,如果你这样做,继续阅读,这就是它变得有趣的地方。

当用户恢复购买时,您应该使用restoreCompletedTransactionsWithApplicationUsername方法拨打电话,而不是restoreCompletedTransactions

文档不清楚接下来会发生什么,但我的理解是,如果在购买通话中发送的用户名与恢复通话中发送的用户名不同,则交易状态将为SKPaymentTransactionStateFailed

但如果我错了,那么您应该能够在交易的payment属性中找到applicationUsername,并在NSUserDefaults上设置您的属性之前自行比较。{1}}。对不起,我自己没试过,我只知道这个理论。

设置用户名时,请勿将其设置为纯文本,applicationUsername上的文档会提示...

  

建议的实现是使用用户帐户名的单向散列来计算此属性的值。

进一步在Detecting Irregular Activity他们解释......

  

不要将Apple ID用于您的开发者帐户,用户的Apple ID或服务器上用户未加散设备的帐户名称。

另外,理想情况下,您将使用常量标识符,即无法为用户更改的内容。例如,如果您使用其电子邮件地址的哈希值,如果他们更改了它并且您没有将该哈希值保留为常量,那么恢复将会因意外的副作用而失败。

希望这有帮助。

答案 1 :(得分:0)

您可以通过检查收据的originalTransactionIdentifier来控制它。对于从一个itunes帐户购买的所有内容,这一点保持不变。您可以将此originalTransactionIdentifier与用户名相关联。下次如果您针对不同的用户名收到一些已经存储的originalTransactionIdentifier,您可以根据自己的适用性采取行动。