我真的不想将GameCenter用于“所有”事情,因为这会将我的用户群分成仅限于iOS设备。
从developer.apple.com:
...如果您的应用程序连接到自己的网络服务,则可以使用玩家标识符将数据保存在该处。
由于玩家标识符并不是私有的,我们有多么确信它不会被伪造?
...如果您的应用程序连接到自己的网络服务,则可以使用玩家标识符将数据保存在该处。
由于玩家标识符并不是私有的,我们有多么确信它不会被伪造?
GKLocalPlayer
中的所有内容都可以被伪造,同样也适用于UIDevice
。
更好的策略是为每个连接的设备分配私有会话数据,并提供通过验证电子邮件将设备会话链接到帐户的手段。也许可以包括playerID
以允许与GameKit数据交互,但不作为身份识别的手段。
从iOS 7开始,使用以下代码似乎是可行的:
[localPlayer generateIdentityVerificationSignatureWithCompletionHandler]
我不确定玩家ID是否可以伪造,但您可以基于此生成一个密钥,以及iOS用户拥有的其他唯一ID:他们的UDID。当玩家成功登录Game Center时,基于UDID生成一个密钥。如果它与存储的值匹配,那么就没问题了。如果不匹配,则很可能是用户在另一台设备上,因为他们已经成功登录到游戏中心。在这种情况下,提供添加选项。为了防止会话劫持,通过电子邮件确认新设备。但这仅适用于iOS设备,因为它与游戏中心和UDID绑定。
另一种方法可以处理其他平台,即在第一次运行时让您的游戏联系您的服务器并从服务器获取生成的唯一ID。每当您的应用程序报告分数(或其他任何内容)时,都会发送您自己的ID。有一些加密数据的方法,但我在这个领域甚至不是业余爱好者。我对那里没有任何有用的了解。(如果您想要,可以研究在请求中发送“API密钥”或发送“盐哈希”。但我不知道那对您有什么帮助。我之前听说过这些,但怀疑它们是否有所帮助。)
localPlayer.isAuthenticated
是否为真。Game Center会处理这个问题。第二部分呢?在服务器端生成自己的ID。始终存在会话劫持的风险。确认电子邮件可以帮助解决这个问题。 - Moshe
loadFriendsWithCompletionHandler:
查询您朋友的playerID,并且我相信它们也可以通过排行榜获得。我确信GameCenter使用内部秘密来确保在进行请求时已登录,但由于我无法访问它,因此似乎没有办法从第三方服务器验证GameCenter登录。 - Kendall Hopkins