我正在开发一个iOS应用程序,用户可以通过应用内购买购买额外的功能 . 我已经在应用程序中购买并恢复正常运行的购买,我将 boolean
保存为 boolean
,说明他们是否已成功购买或恢复购买 .
然而,如果用户1在他们的手机上购买应用内购买,则会出现一个错误,然后登录用户2手机上的App Store并恢复购买 . 然后再次注销并允许用户2重新登录,这意味着用户2仍然可以免费解锁应用内购买,因为 NSUserDefaults
中的 boolean
仍然设置为true .
我正试图找到一种方法来查询用户的App Store电子邮件或其他方式来检查用户的App Store电子邮件是否与他们购买的电子邮件相同 . 但这需要在本地完成,因为用户可以在没有任何互联网连接时使用此功能 .
有没有人对我如何做到这一点或任何更好的做法有任何建议?
谢谢
2 回答
不幸的是,这是设计上的,所以古老的格言“它不是一个错误,它是一个特征” .
它的设计是这样的,因此拥有多个设备(例如iPhone和iPad)的用户可以在第一台设备上进行购买,并通过在其他设备上恢复购买而获益 .
当然,这为人们在其他人设备上分享购买打开了大门,正如您所描述的那样 .
好消息是
SKPayment
上有一个名为applicationUsername的属性,其目的是作为文档状态......如果您没有任何唯一标识用户的信息,例如:一个电子邮件,用户名,身份证等,然后你的问题无法解决我很抱歉,但如果你这样做,继续阅读,这是有趣的地方 .
当用户恢复购买时,您应使用restoreCompletedTransactionsWithApplicationUsername方法拨打电话而不是
restoreCompletedTransactions
.文档不清楚接下来会发生什么,但我的理解是,如果在购买呼叫中发送的用户名与恢复呼叫中发送的用户名不同,则事务状态将为
SKPaymentTransactionStateFailed
.但是,如果我错了,那么你应该能够在事务的payment属性上找到
applicationUsername
,并在设置NSUserDefaults
属性之前自己进行比较 . 对不起,我自己没试过,我只知道这个理论 .设置用户名时,不要将其设置为纯文本,applicationUsername上的文档表明...
他们在Detecting Irregular Activity进一步解释......
此外,理想情况下,您将使用常量标识符,即无法为用户更改的内容 . 例如,如果您使用其电子邮件地址的哈希值,如果他们更改它并且您没有将该哈希值保留为常量恢复将作为意外的副作用而失败 .
希望这可以帮助 .
您可以通过检查收据的originalTransactionIdentifier来控制它 . 因为从一个itunes帐户购买的所有内容都是一样的 . 您可以将此originalTransactionIdentifier与用户名相关联 . 下次如果您针对不同的用户名收到一些已存储的originalTransactionIdentifier,您可以根据您的适用性采取措施 .