iOS 9.2上的Game Center Crashing App

时间:2016-02-20 17:38:51

标签: ios swift

我在Xcode上收到了几个关于iOS 9.2.1的崩溃报告,我的应用程序崩溃在下一行。

gameSettings.setHighScore(localPlayerScore!.value, highScore: gameSettings.getHighScore())

该行是我的GameViewController

中以下方法的一部分
func syncGameCenterHighScore() {
    if GKLocalPlayer.localPlayer().authenticated == true {
        let leaderBoardRequest = GKLeaderboard()
        leaderBoardRequest.identifier = "game"

        leaderBoardRequest.loadScoresWithCompletionHandler { (scores, error) -> Void in
            if (error != nil) {
                print("Error: \(error!.localizedDescription)")
            } else if (scores != nil) {
                let localPlayerScore = leaderBoardRequest.localPlayerScore
                gameSettings.setHighScore(localPlayerScore!.value, highScore: gameSettings.getHighScore())
            }
        }
    }
}

GameSettings getHighScore()

func getHighScore() -> Int64 {
    return  NSUserDefaults.standardUserDefaults().objectForKey("highScore")?.longLongValue ?? 0
}

我一直无法复制这个问题。我试过了:

  • 登入游戏中心,没有事先得分
  • 退出游戏中心没有事先得分
  • 在游戏中心签名
  • 退出游戏中心之前的分数
  • 新游戏中心帐户没有先前的分数。

我认为该问题可能来自我的getHighScore()方法,并且无法转换为int64。

2 个答案:

答案 0 :(得分:1)

我将摆脱那个强制解包的localPlayerScore变量和可选的绑定(或者你喜欢的任何东西),然后看看你是否仍然遇到问题。

我不熟悉Game Center,除非你检查的得分变量与leaderBoardRequest.localPlayerScore相同,否则你的localPlayerScore在某种情况下可能会返回nil。就好像应用程序之前从未在设备上运行一样?

答案 1 :(得分:0)

这就是我在游戏中完成此任务的方式。

我如何验证用户身份:

func authenticateLocalPlayer(){

    let localPlayer = GKLocalPlayer.localPlayer()

    localPlayer.authenticateHandler = {(scene, error) -> Void in
        if error == nil {

            //If GameCenter login is successful
            if GKLocalPlayer.localPlayer().authenticated{
                //Checks if users that had highscores before the leaderboards were implemented, and stores saves it to leaderboards.
                if self.gameCenterAvailable == true && GKLocalPlayer.localPlayer().authenticated {

                    let high = NSUserDefaults.standardUserDefaults().integerForKey("highscore")

                    self.saveHighscore(high)

                    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "savedHighest")
                }
            }
        } else {
            self.gameCenterAvailable = false
        }
    }
}

我如何保存高分:

func saveHighscore(userScore: Int) {

    //check if user is signed in
    if GKLocalPlayer.localPlayer().authenticated {

        let scoreReporter = GKScore(leaderboardIdentifier: "xYOUR_LEADERBOARD_ID_HEREx") //leaderboard id here

        scoreReporter.value = Int64(userScore) //score variable here (same as above)

        let scoreArray: [GKScore] = [scoreReporter]

        GKScore.reportScores(scoreArray, withCompletionHandler: nil)
    }
}

当我创建我的应用程序时,我没有排行榜,所以我在游戏制作完成后实现了这一点。最初,高分仅存储在NSUserDefaults本地。

所以我做的就是用户打开应用程序并登录游戏中心。它会检查NSUserDefaults以获取当前的Highscore并将其保存到GameCenter,以便每次打开应用程序时使用用户的本地高分数更新排行榜。这也允许用户在没有互联网访问的情况下进行游戏,并且在以后重新连接时仍然会在排行榜上显示他们的分数。

稍后,一旦用户死亡或游戏结束,我会检查用户的NSUserDefaults值得分,并将其与我们游戏的那一轮的得分进行比较。如果他们的新分数高,那么你运行saveHighscore函数。

编辑:此外,出于好奇,您的应用实际上是使用iOS 9.2中实现/仅提供的任何功能吗?如果不是,您可以将应用程序的要求降低到iOS 8.0,从而允许您的应用程序可供更多用户使用,而且对您的应用程序没有任何影响。