如何为玩家列出所有可用的GKTurnBasedMatches?

我正在使用Game Center的回合制比赛来构建游戏。

我想显示所有可用匹配项的列表。 我尝试过使用loadMatchesWithCompletionHandler() ,但游戏数组返回为nil ,错误也返回为nil 。 有一些正在进行的比赛。

这是我到目前为止:

 func authenticateLocalUser() { if !gameCenterAvailable { return } let player = GKLocalPlayer.localPlayer() if player.authenticated == false { player.authenticateHandler = {(viewController, error) -> Void in if viewController != nil && self.presentingViewController != nil { self.presentingViewController!.presentViewController(viewController!, animated: true, completion: { GKLocalPlayer.localPlayer().registerListener(self) GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in print(games) if games != nil { print(games!.count) }else { print(error) } }) }) } else { if player.authenticated == true { GKLocalPlayer.localPlayer().registerListener(self) GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in print(games) if games != nil { print(games!.count) }else { print(error) } }) } } } } else { print("already authenticated") } } 

在创建新匹配时我甚至会得到nil (它会打印我刚刚创建的匹配):

 func findMatchWith(minPlayers: Int, maxPlayers: Int) { if !gameCenterAvailable { return } let request = GKMatchRequest() request.minPlayers = minPlayers request.maxPlayers = maxPlayers request.defaultNumberOfPlayers = 2 GKLocalPlayer.localPlayer().loadFriendPlayersWithCompletionHandler({players, error in if error != nil {return} request.recipients?.append(players![0]) GKTurnBasedMatch.findMatchForRequest(request, withCompletionHandler: { match, error in if error != nil { print(error?.localizedDescription) return } print(match) GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in print(games) if games != nil { print(games!.count) }else { print(error?.localizedDescription) } }) }) }) } 

这不是代码。 这就是在iTunes Connect中设置游戏的方式。 我需要这样做:

  1. 转到我的应用程序> App Store>准备提交并切换Game Center的开关
  2. 添加我之前在“function”下创建的排行榜

稍后,我将尝试删除排行榜,看看它是否仍然有效。 实际的应用程序不会有排行榜。

我的困惑是因为我没有得到“无法识别的游戏”错误,我能够创建比赛,转弯,列出玩家的朋友,但不能列出匹配。

从您展示的片段中分辨出来有点难。 要仔细检查的事情:

  1. 你在哪里创造比赛? 您可能已经知道这一点,但以防万一:loadMatchesWithCompletionHandler显示您已创建,被邀请或加入的匹配项。 它没有显示等待球员的所有比赛。
  2. 用于呈现登录视图控制器的完成处理程序将永远不会成功加载任何匹配。 一旦成功显示登录视图控制器,该完成处理程序将立即触发。 它不会等到您实际提交登录凭据。 因此,在您进行身份validation之前,将尝试加载匹配,并始终返回null。
  3. 您的完成处理程序将在两种情况下被调用。 当您设置完成处理程序时,它会发生一次,如您所料。 登录视图控制器(如果显示)完成执行后将再次调用它。 在第二个实例中,如果用户取消登录或登录失败,您可能会收到错误。 或者,您似乎是一个没有VC的经过身份validation的登录用户。
  4. 您的身份validation链中有一些假设并不总是有效:

你假设.authenticated是YES然后你登录。不幸的是,这并不总是正确的。 GC将在无法与GC服务器通信但使用先前会话的缓存数据的情况下报告YES。 (通常情况下,当您在此状态下尝试加载匹配时,实际上会收到有关未进行身份validation的错误)

假设VC为零,那么您将通过身份validation。 这也不总是正确的。 如果设置了错误,VC也将为零。 始终在身份validation处理程序中首先检查错误的值。 (我不认为这会对您的问题产生影响,但是,因为再次:如果您在实际未经过身份validation时尝试加载匹配项,则会出现错误)

如果您有兴趣,可以在https://stackoverflow.com/a/372​​16566/1641444上查看我的身份validation处理程序示例,该处理程序可以捕获各种边缘情况和故障。