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

How to list all available GKTurnBasedMatches for a player?

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

我想显示所有可用匹配项的列表。我试过使用 loadMatchesWithCompletionHandler(),但游戏数组 returns 为 nil,并且错误也 returns 为 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)
                } 
            })
        })
    })
}

从您显示的片段中有点难以分辨。需要仔细检查的事项:

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

你假设如果 .authenticated 是 YES 那么你已经登录了。不幸的是,这并不总是正确的。 GC 将在无法与 GC 服务器通信但正在使用先前会话中的缓存数据的情况下报告 YES。 (不过,通常情况下,当您尝试在此状态下加载匹配项时,您实际上会收到有关未通过身份验证的错误消息)

你假设如果 VC 为零,那么你就通过了身份验证。这也不总是正确的。如果设置了错误,VC 也将为 nil。始终首先检查身份验证处理程序中的错误值。 (不过,我认为这现在不会导致您的问题,因为再次:如果您在实际上未通过身份验证时尝试加载匹配项,您应该会收到错误消息)

如果您有兴趣,可以在

查看我的身份验证处理程序的示例,它捕获各种边缘情况和失败

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

  1. 前往“我的应用”>“应用商店”>“准备提交”并切换 Game Center 开关
  2. 添加我之前在 "Features"
  3. 下创建的排行榜

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

我的困惑是因为我没有收到 "unrecognized game" 错误,我可以创建比赛、玩回合、列出玩家的朋友,但不能列出比赛。