2015-12-23 6 views
0

С некоторыми исследованиями, это то, что я считал правильным кодом. Кажется, что все работает, и есть NO ошибок. Первый высокий рейтинг загруженных показывает в таблице лидеров (для обеих учетных записей Game Center, которые я использую для тестирования), но любой балл, загруженный после первоначального высокого балла (который должен заменить его), не отображается (я попытался использовать более одной учетной записи , тот же выпуск). Вот мой код (я вызываю эту функцию при нажатии кнопки). Все загружается отлично, и окно Game Center отлично закрывается с ошибками NO, но счет для учетной записи 1 остается равным 0 (это был первый балл, загруженный), а счет для учетной записи 2 остается равным 2 (который был первым загруженным счетом). (highScore - это сохраненный NSInteger перед вызовом этой функции) Пожалуйста, помогите!Нужна помощь по исправлению моего кода при загрузке High Score в таблицу лидеров игрового центра в iOS

func saveHighscore() { 

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


      let gameScoreReporter = GKScore(leaderboardIdentifier: "color_runner_leaderboard") 

      gameScoreReporter.value = Int64(highScore) 

      let scoreArray1: [GKScore] = [gameScoreReporter] 

      GKScore.reportScores(scoreArray1, withCompletionHandler: {(NSError) -> Void in 
       if NSError != nil { 
        print(NSError!.localizedDescription) 
       } else { 
        print("completed Easy") 
       } 

      }) 

     } 

    } 

Этот код показывает лидеров:

//show leaderboard screen 
func showLeader() { 
    let vc = self.view?.window?.rootViewController 
    let gc = GKGameCenterViewController() 
    gc.gameCenterDelegate = self 
    vc?.presentViewController(gc, animated: true, completion: nil) 
} 

Этот код то, что загружает счет (который, кажется, не работает после загрузки FIRST оценка) и отображает Полноразмерный

let highScoreDefault = NSUserDefaults.standardUserDefaults() 
    if highScoreDefault.valueForKey("HighScoreSaved") != nil { 
     highScore = highScoreDefault.valueForKey("HighScoreSaved") as! NSInteger! 
     [saveHighscore()] 
    } 




    [showLeader()] 
+0

Возможный дубликат [IOS Game Center: результаты не показывают на лидеров в песочнице] (http://stackoverflow.com/questions/8720316/ios-game-center-scores- not-show-on-leaderboard-in-sandbox) – CStreel

+0

К сожалению, это не помогло решить мою проблему. Должно быть связано с кодом. – baymitchell12

+0

Итак, вы пытались отчитываться от нескольких учетных записей, и это не отображается? Другая распространенная ошибка, которую люди совершают, заключается в том, что они загружают неправильную таблицу лидеров при проверке таблицы лидеров. Также может быть, что он еще не загружен, иногда при обработке песочницы иногда требуется немного больше времени. – CStreel

ответ

0

Попробуйте это:

func saveHighScore(identifier: String, score: Int) { 

    if (GKLocalPlayer.localPlayer().authenticated) { 

     let scoreReporter = GKScore(leaderboardIdentifier: identifier) 
     scoreReporter.value = Int64(score) 

     let scoreArray:[GKScore] = [scoreReporter] 

     GKScore.reportScores(scoreArray, withCompletionHandler: { 

      error -> Void in 

      if (error != nil) { 

       print("error") 
      } 
      else { 
       print("Posted score of \(score)") 
      } 
     }) 
     } 
    } 

Если вы хотите, чтобы сохранить высокий балл, добавьте этот код:

self.saveHighScore("yourLeaderboardName", score: GameState.sharedInstance.highScore)

Добавить этот класс. GameState.swift:

import Foundation 

class GameState { 
    var score: Int 
    var highScore: Int 
    var coins: Int 

    init() { 
    // Init 
    score = 0 
    highScore = 0 
    coins = 0 

    // Load game state 
    let defaults = NSUserDefaults.standardUserDefaults() 

    highScore = defaults.integerForKey("highScore") 
    coins = defaults.integerForKey("coins") 
    } 

    func saveState() { 
    // Update highScore if the current score is greater 
    highScore = max(score, highScore) 

    // Store in user defaults 
    let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setInteger(highScore, forKey: "highScore") 
    defaults.setInteger(coins, forKey: "coins") 
    NSUserDefaults.standardUserDefaults().synchronize() 
    } 

    class var sharedInstance: GameState { 
    struct Singleton { 
     static let instance = GameState() 
    } 

    return Singleton.instance 
    } 
} 

И добавьте этот вспомогательный класс в свой собственный файл Swift. Не уверен, что это необходимо. Я называю это GameKitHelper.swift:

import UIKit 
import Foundation 
import GameKit 

let PresentAuthenticationViewController = "PresentAuthenticationViewController" 

class GameKitHelper: NSObject { 

static let sharedInstance = GameKitHelper() 


var authenticationViewController: UIViewController? 
var gameCenterEnabled = false 

func authenticateLocalPlayer() { 

    //1 
    let localPlayer = GKLocalPlayer() 
    localPlayer.authenticateHandler = {(viewController, error) in 

     if viewController != nil { 
      //2 
      self.authenticationViewController = viewController 

        NSNotificationCenter.defaultCenter().postNotificationName(PresentAuthenticationViewController, object: self) 
     } else if error == nil { 
      //3 
      self.gameCenterEnabled = true 
     } 
     } 

    } 

    func reportAchievements(achievements: [GKAchievement], errorHandler: ((NSError?)->Void)? = nil) { 
    guard gameCenterEnabled else { 
     return 
    } 

    GKAchievement.reportAchievements(achievements, withCompletionHandler: errorHandler) 
    } 

    func showGKGameCenterViewController(viewController: UIViewController) { 
     guard gameCenterEnabled else { 
     return 
    } 

    //1 
    let gameCenterViewController = GKGameCenterViewController() 

    //2 
    gameCenterViewController.gameCenterDelegate = self 

    //3 
    viewController.presentViewController(gameCenterViewController, animated: true, completion: nil) 
} 

    func saveHighScore(identifier: String, score: Int) { 

     if (GKLocalPlayer.localPlayer().authenticated) { 

     let scoreReporter = GKScore(leaderboardIdentifier: identifier) 
     scoreReporter.value = Int64(score) 

     let scoreArray:[GKScore] = [scoreReporter] 

     GKScore.reportScores(scoreArray, withCompletionHandler: { 

      error -> Void in 

      if (error != nil) { 

       print("error") 
      } 
      else { 

       print("Posted score of \(score)") 
      } 
     }) 
     } 
    } 
    } 

extension GameKitHelper: GKGameCenterControllerDelegate { 
    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController) { 
    gameCenterViewController.dismissViewControllerAnimated(true, completion: nil) 
    } 
}