ios - 奇怪的 GameKit 错误。 GKLocalPlayer 正在返回对手

标签 ios ios8 sprite-kit game-center gamekit

我正在使用游戏中心制作 Sprite Kit 多人游戏。

我正在使用以下代码获取本地播放器。

GKLocalPlayer.localPlayer()

我用它来获取像玩家 ID 和别名这样的东西:

GKLocalPlayer.localPlayer().playerID
GKLocalPlayer.localPlayer().alias

非常简单。但最奇怪的事情发生了。偶尔在比赛期间 GKLocalPlayer.localPlayer() 会返回对手(即其他玩家)的玩家 ID 和别名。可以想象,这会导致各种问题。

一些附加信息:

  • 是的,我对所有用户进行了身份验证。
  • 两个用户都使用不同的帐户登录到 Game Center 沙盒服务器。
  • 如上所述,本地播放器最初是正确的。但是在建立播放器之间的连接并且我开始发送数据包之后,本地播放器偶尔会返回错误的用户。之后它会继续返回错误信息,直到应用程序被重置。
  • 我已经测试了几个小时。我很肯定这不是我。事实上,据我所知,Apple 不允许您以编程方式更改 GKLocalPlayer。
  • 我在实际设备上运行的是 iOS 8。

这是一个已知问题吗?有人有什么建议吗?我真的很茫然。我想也许我可以尝试调用 GKLocalPlayer.localPlayer() 并保存属性(在奇怪的错误发生之前),而不是不断调用 GKLocalPlayer.localPlayer() 来访问本地播放器。但话又说回来,这只是一种解决方法。

编辑:

为了测试这个问题,我正在运行一个像这样的简单计时器:

NSTimer .scheduledTimerWithTimeInterval(1.0, target: self, selector: "test", userInfo: nil, repeats: true)
func test() {
        println("\(GKLocalPlayer.localPlayer().playerID)")
    }

输出是这样的:(我没有显示整个玩家 ID)。注意 playerID 是如何变化的。而且查了一下,确实是改成对方的playerID。别名等也是如此。

G:43...
G:43...
G:43...
G:43...
G:43...
G:43...
G:84...
G:84...
G:84...
G:84...

最佳答案

我也遇到了这个问题。问题是您正在来回传递本地播放器。所以,当本地播放器进来的时候,经过反序列化,传入的播放器就变成了本地播放器。

我通过实现我自己的具有 displayName 和 playerID 的播放器对象来解决这个问题。您可以从本地玩家创建一个 guest 玩家并使用它来传递。只是不要传递本地玩家。

关于ios - 奇怪的 GameKit 错误。 GKLocalPlayer 正在返回对手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594037/

相关文章:

ios - 强制 UITextView 正确换行

ios - SKPhysicsBody 减速程序

ios - 如何通过 UIButtons 读取 UILabel(没有文本)

ios - 我们可以使用一个具有两种不同编程语言的两个不同项目的单个应用程序吗?

ios - NSUserDefault 无法在 iOS8 的扩展中保存和加载

UITabBarController 和 UINavigation Controller 的 iOS8 旋转问题

ios - Sprite Kit - 为多个场景定义变量

ios - 如何在 Scene Kit 中更改场景?

ios - OpenGL ES 1.1 中的 GL_ALPHA_TEST 替换(无着色器)

ios - 如何在 iOS 中使用 Crashlytics 而不使用 Fabric