我正在开发一个iOS应用程序,用户可以通过应用内购买购买额外的功能。我已经让应用内购买和恢复正常运行,我将boolean
保存到NSUserDefaults
,说明他们是否已成功购买或恢复购买。
然而,如果用户1在手机上购买应用内购买,则会出现一个错误,然后登录到用户2手机上的App Store并恢复购买。然后再次注销并允许用户2重新登录,这意味着用户2仍然可以免费解锁应用内购买,因为boolean
中的NSUserDefaults
仍然设置为真。
我试图找到一种方法来查询用户的App Store电子邮件或其他方式来检查用户的App Store电子邮件是否与他们购买的电子邮件相同。但这需要在本地完成,因为用户可以在没有任何互联网连接时使用此功能。
有没有人对我如何做到这一点或任何更好的做法有任何建议?
谢谢
答案 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,您可以根据自己的适用性采取行动。