簡體   English   中英

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

[英]How to list all available GKTurnBasedMatches for a player?

我正在使用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>准備提交並切換游戲中心的開關
  2. 添加我之前在“功能”下創建的排行榜

稍后,我將嘗試刪除排行榜,看看它是否仍然有效。 實際的應用程序將沒有排行榜。

我的困惑是因為我沒有得到“無法識別的游戲”錯誤,我能夠創建比賽,轉彎,列出玩家的朋友,但不能列出匹配。

從您展示的片段中分辨出來有點難。 要仔細檢查的事情:

  1. 你在哪里創造比賽? 您可能已經知道這一點,但以防萬一:loadMatchesWithCompletionHandler顯示您已創建,被邀請或加入的匹配項。 它沒有顯示等待球員的所有比賽。
  2. 用於呈現登錄視圖控制器的完成處理程序將永遠不會成功加載任何匹配。 一旦成功顯示登錄視圖控制器,該完成處理程序將立即觸發。 它不會等到您實際提交登錄憑據。 因此,在您進行身份驗證之前,將嘗試加載匹配,並始終返回null。
  3. 您的完成處理程序將在兩種情況下被調用。 當您設置完成處理程序時,它會發生一次,如您所料。 登錄視圖控制器(如果顯示)完成執行后將再次調用它。 在第二個實例中,如果用戶取消登錄或登錄失敗,您可能會收到錯誤。 或者,您似乎是一個沒有VC的經過身份驗證的登錄用戶。
  4. 您的身份驗證鏈中有一些假設並不總是有效:

你假設.authenticated是YES然后你登錄。不幸的是,這並不總是正確的。 GC將在無法與GC服務器通信但使用先前會話的緩存數據的情況下報告YES。 (通常情況下,當您在此狀態下嘗試加載匹配項時,實際上會收到有關未進行身份驗證的錯誤)

假設VC為零,那么您將通過身份驗證。 這也不總是正確的。 如果設置了錯誤,VC也將為零。 始終在身份驗證處理程序中首先檢查錯誤的值。 (我不認為這會對您的問題產生影響,但是,因為:如果您在實際未經過身份驗證時嘗試加載匹配項,則會出現錯誤)

如果您有興趣,可以在https://stackoverflow.com/a/372​​16566/1641444上查看我的身份驗證處理程序示例,該處理程序可以捕獲各種邊緣情況和故障。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM