2015-02-14 3 views
2

Я использовал GKLeaderboard.loadScoresWithCompletionHandler, а затем свойство localPlayerScore, так что я могу получить высокий балл пользователя от Game Center, когда моя игра запущена.GKLeaderboard.localPlayerScore возвращает nil на iOS 8.1.3?

Теперь на iOS 7.0 до 8.1.2, я получаю действительный объект GKScore, когда я обращаюсь к свойству localPlayerScore. На iOS 8.1.3, однако, я получаю ноль, из-за которого мое приложение терпит крах. Я получаю ошибку времени выполнения, заявив, что она обнаружила нуль при развертывании необязательного.

Вот фрагмент кода, имеющие отношение к вопросу:

func compareLocalHighScoreFromLeaderboards() 
{ 
    // This is to fetch data from the high score leaderboard 
    let leaderboardRequest = GKLeaderboard() 
    leaderboardRequest.identifier = GlobalVariables.sharedInstance._highScoreLeaderboardID 
    leaderboardRequest.loadScoresWithCompletionHandler { (scores, error) -> Void in 

     if error != nil 
     { 
      println("Error fetching score from leaderboards: \(error))") 
     } 
     else if scores != nil 
     { 
      println("entered loading scores from leaderboards") 


      let leaderboardScore = leaderboardRequest.localPlayerScore // this returns a GKScore object 

      var playerLocalHighScore = NSUserDefaults.standardUserDefaults().objectForKey(GlobalVariables.sharedInstance._highScoreKey) as NSNumber 


      // Check first if the saved highscore is updated. 
      if playerLocalHighScore.longLongValue != leaderboardScore.value 
      { 
       // this means that we don't have the updated leaderboard score in our device 
       if playerLocalHighScore.longLongValue > leaderboardScore.value 
       { 

        println("Local score is greater than leaderboard highscore. Do nothing because GameKit will automatically report to GC when there is internet connectivity") 
       } 
       else if playerLocalHighScore.longLongValue < leaderboardScore.value 
       { 

        // update the local highscore with the leaderboard highscore 
        let updatedHighscore: NSNumber = NSNumber(longLong: leaderboardScore.value) 
        NSUserDefaults.standardUserDefaults().setObject(updatedHighscore, forKey: GlobalVariables.sharedInstance._highScoreKey) 

        // send notification message to MainMenuScene to update the SKLabelNode 
        NSNotificationCenter.defaultCenter().postNotificationName(UpdatedLocalHighScore, object: nil) 
       } 
      } 
      else 
      { 
       println("The local highscore and the leaderboard highscore are already in sync") 
      } 


     } 
    } 
} 

Я использую этот же код для моих предыдущих игр (которые одобрены и живут на Appstore, кстати), чтобы получить пользователь игровой центр с высоким рейтингом и не сталкивался с этим вопросом до 8.1.3.

Мое приложение было отклонено Apple, потому что они протестировали его с помощью устройства iOS 8.1.3 и оно разбилось. Я сделал некоторую отладку и узнал, что это localPlayerScore, являющееся нолем, является корнем проблемы.

Любой, кто сталкивается с этим вопросом в последнее время? Кто-нибудь знает, как решить эту проблему?

Любая помощь приветствуется.

+0

Если авария вызвана ' localPlayerScore' является 'nil', то он не включен в этот отрывок. Что в '...'? – mattt

+0

@mattt Я отредактировал мое сообщение, чтобы включить мой полный метод. В основном, я получаю высокий балл GC игрока, а затем сравниваю его с локально сохраненным высоким счетом на устройстве пользователя, чтобы синхронизировать их. Приложение вылетает из-за того, что моя переменная leaderboardScore равна нулю. Это меня смущает, потому что это отлично работает на iOS 7.0 до 8.1.2. – aresz

+0

@aresz вы нашли исправление? Я столкнулся с той же проблемой. Если вы можете опубликовать его здесь, я буду так благодарен. – Cesare

ответ

0

Изменение else if scores != nil для этого else if leaderBoardRequest.localPlayerScore != nil, потому что scores содержат всю информацию о leaderboardRequest.identifier и в первый раз, когда пользователь откроет свою игру, leaderBoardRequest.localPlayerScore пуст, но scores не обязательно

let leaderboardRequest = GKLeaderboard() 
leaderboardRequest.identifier = GlobalVariables.sharedInstance._highScoreLeaderboardID 
leaderboardRequest.loadScoresWithCompletionHandler { (scores, error) -> Void in 
    if error != nil 
    { 
     println("Error fetching score from leaderboards: \(error))") 
    } 
    else if leaderBoardRequest.localPlayerScore != nil 
    { 
     println("entered loading scores from leaderboards") 


     let leaderboardScore = leaderboardRequest.localPlayerScore // this returns a GKScore object 

     var playerLocalHighScore = NSUserDefaults.standardUserDefaults().objectForKey(GlobalVariables.sharedInstance._highScoreKey) as NSNumber 


     // Check first if the saved highscore is updated. 
     if playerLocalHighScore.longLongValue != leaderboardScore.value 
     { 
      // this means that we don't have the updated leaderboard score in our device 
      if playerLocalHighScore.longLongValue > leaderboardScore.value 
      { 

       println("Local score is greater than leaderboard highscore. Do nothing because GameKit will automatically report to GC when there is internet connectivity") 
      } 
      else if playerLocalHighScore.longLongValue < leaderboardScore.value 
      { 

       // update the local highscore with the leaderboard highscore 
       let updatedHighscore: NSNumber = NSNumber(longLong: leaderboardScore.value) 
       NSUserDefaults.standardUserDefaults().setObject(updatedHighscore, forKey: GlobalVariables.sharedInstance._highScoreKey) 

       // send notification message to MainMenuScene to update the SKLabelNode 
       NSNotificationCenter.defaultCenter().postNotificationName(UpdatedLocalHighScore, object: nil) 
      } 
     } 
     else 
     { 
      println("The local highscore and the leaderboard highscore are already in sync") 
     } 


    }else{ 
println("leaderBoardRequest.localPlayerScore is empty")} 
///here report the local high score to leaderboard 
} 
Смежные вопросы