我在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。
答案 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,从而允许您的应用程序可供更多用户使用,而且对您的应用程序没有任何影响。