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

时间:2016-05-11 20:12:54

标签: ios game-center gkturnbasedmatch

我正在使用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)
                } 
            })
        })
    })
}

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

从你已经展示过的片段来说,这有点难以辨别。要仔细检查的事情:

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

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

    如果您有兴趣,可以在https://stackoverflow.com/a/37216566/1641444

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