奇怪的GameKit Bug。 GKLocalPlayer正在回归对手

时间:2014-12-21 21:29:40

标签: ios ios8 sprite-kit game-center gamekit

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

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

GKLocalPlayer.localPlayer()

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

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

非常简单。但最奇怪的事情发生了。偶尔在比赛期间GKLocalPlayer.localPlayer()将返回OPPONENT(即其他玩家)玩家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如何变化。我检查过,它确实改变了对手的玩家ID。对于别名等也是如此。

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

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题。问题是你来回传递本地播放器。因此,当本地玩家进入后,在被反序列化后,传入的玩家将成为本地玩家。

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