[英]In-App-Purchase Bug
我正在开发一个iOS应用程序,用户可以通过应用内购买购买额外的功能。 我已经在应用程序中购买和恢复正常运行的购买,在那里我向NSUserDefaults
保存一个boolean
,说明他们是否已成功购买和/或恢复购买。
然而,如果用户1在他们的手机上购买应用内购买,则会出现一个错误,然后登录到用户2手机上的App Store并恢复购买。 然后再次注销并允许用户2重新登录,这意味着用户2仍然可以免费解锁应用内购买,因为NSUserDefaults
的boolean
仍然设置为true。
我正试图找到一种方法来查询用户的App Store电子邮件或其他方式来检查用户的App Store电子邮件是否与他们购买的电子邮件相同。 但这需要在本地完成,因为用户可以在没有任何互联网连接时使用此功能。
有没有人对我如何做到这一点或任何更好的做法有任何建议?
谢谢
不幸的是,这是设计上的,因为古老的谚语“它不是一个错误,它是一个特征”。
它的设计是这样的,因此拥有多个设备(例如iPhone和iPad)的用户可以在第一台设备上进行购买,并通过在其他设备上恢复购买而获益。
当然,这为人们在其他人设备上分享购买打开了大门,正如您所描述的那样。
好消息是SKPayment
上有一个名为applicationUsername
的属性,其作为文档状态的目的......
使用此属性可帮助商店检测不规则活动。 例如,在游戏中,数十个不同的iTunes Store帐户代表相同的游戏内角色进行购买是不常见的。
如果你没有任何独特的东西来识别用户,例如电子邮件,用户名,身份证等,那么你的问题就无法解决了。很抱歉,如果你这样做,继续阅读,这就是它变得有趣的地方。
当用户恢复购买时,您应该使用restoreCompletedTransactionsWithApplicationUsername
方法来调用而不是restoreCompletedTransactions
。
文档不清楚接下来会发生什么,但我理解的是,如果在购买呼叫中发送的用户名与恢复呼叫中发送的用户名不同,则交易状态将为SKPaymentTransactionStateFailed
。
但是,如果我错了,那么您应该能够在交易的payment
属性上找到applicationUsername
并在NSUserDefaults
上设置您的属性之前自己进行比较。 对不起,我自己没试过,我只知道这个理论。
设置用户名时,不要将其设置为纯文本, applicationUsername
上的文档建议...
建议的实现是使用用户帐户名的单向散列来计算此属性的值。
进一步在检测不规则活动时,他们解释......
不要将Apple ID用于您的开发者帐户,用户的Apple ID或服务器上用户未加散设备的帐户名称。
此外,理想情况下,您将使用常量标识符,即无法为用户更改的内容。 例如,如果您使用其电子邮件地址的哈希值,如果他们更改了它并且您没有将该哈希值保留为常量恢复将作为意外的副作用而失败。
希望这可以帮助。
您可以通过检查收据的originalTransactionIdentifier来控制它。 对于从一个itunes帐户购买的所有内容,这一点保持不变。 您可以将此originalTransactionIdentifier与用户名相关联。 下次如果您针对不同的用户名收到一些已存储的originalTransactionIdentifier,您可以根据您的适用性采取行动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.