Search code examples
swiftsprite-kitapp-store-connectgame-centergame-center-leaderboard

Connecting Itunes Connect To Code For GameCenter Leaderboard


I have used the code below to create my GameCenter page in my app. However, I haven't been able to connect the leaderboard that I created on iTunes Connect to my code, so the app just produces a blank leaderboard page. How do I connect my Itunes Connect leaderboard to my code, and how do I make the app such that it places your score on the leaderboard, as right now the leaderboard is empty.

Here is the code I used:

override func viewDidAppear(animated: Bool) {

    //check user is logged into GameCenter
    var localPlayer = GKLocalPlayer.localPlayer()

    localPlayer.authenticateHandler = {(viewController : UIViewController!, error : NSError!) -> Void in

        if ((viewController) != nil) {

            self.presentViewController(viewController, animated: true, completion: nil)

        } else {

            println((GKLocalPlayer.localPlayer().authenticated))
        }

    }

//display leaderboard
func showLeaderboard() {

    var gcViewController: GKGameCenterViewController = GKGameCenterViewController()
    gcViewController.gameCenterDelegate = self

    gcViewController.viewState = GKGameCenterViewControllerState.Leaderboards

    gcViewController.leaderboardIdentifier = "MyLeaderboard"

    self.showViewController(gcViewController, sender: self)
    self.navigationController?.pushViewController(gcViewController, animated: true)

}

//take leaderboard away
func gameCenterViewControllerDidFinish(gcViewController: GKGameCenterViewController!) {

    self.dismissViewControllerAnimated(true, completion: nil)

}

How do I connect my Itunes Connect leaderboard to the app, and what code do I use to upload one's score to the leaderboard?


Solution

  • Firstly add the GKGameCenterControllerDelegate to your class:

    class viewController: UIViewController, GKGameCenterControllerDelegate {
    ...
    }
    

    This is the code you need to use to authenticate the player:

    func login() {
        println("Game Center Login Called")
        let localPlayer = GKLocalPlayer.localPlayer()
    
        // Handle the authentication
        localPlayer.authenticateHandler = {(Home: UIViewController!, error: NSError!) -> Void in
            if Home != nil {
                println("Authentication is being processed.")
                self.presentViewController(Home, animated: true, completion: nil)
    
            } else {
                println("Player has been successfully authenticated.")
            }
        }
    }
    

    This is the code you should use to show up the leaderboard:

    func showLeaderboard() {
    
        var gcViewController: GKGameCenterViewController = GKGameCenterViewController()
        gcViewController.gameCenterDelegate = self
    
        gcViewController.viewState = GKGameCenterViewControllerState.Leaderboards
    
        gcViewController.leaderboardIdentifier = "YOUR_LEADERBOARD_ID"
        self.showViewController(gcViewController, sender: self)
        self.presentViewController(gcViewController, animated: true, completion: nil)
    }
    

    This code is needed when the user taps on "Done".

    func gameCenterViewControllerDidFinish(gcViewController: GKGameCenterViewController!)
    {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    

    You can call the authentication method login() in the viewDidLoad method:

    override func viewDidLoad() {
        super.viewDidLoad() 
    login()
    ...
    }
    

    Show up the leaderboard when the user taps on a button

    @IBAction func button(sender: AnyObject) {
    
        showLeaderboard()
    }
    

    If you want to submit the best score:

    if GKLocalPlayer.localPlayer().authenticated {
                            println("I have submitted the score to Game Center")
                            let gkScore = GKScore(leaderboardIdentifier: "Best_Score")
                            gkScore.value = Int64(bestScore)
                            GKScore.reportScores([gkScore], withCompletionHandler: ( { (error: NSError!) -> Void in
                                if (error != nil) {
                                    // handle error
                                    println("Error: " + error.localizedDescription);
                                } else {
                                    println("Score reported: \(gkScore.value)")
                                }
                            }))
                        }