0

I did everything right regarding itunes connect, but when I start the app it doesn't authenticate, and when I press my Gamecenter button it gives me a message "Gamecenter is not available, user not signed in" Code:

ViewController:

import UIKit
import SpriteKit
import GameKit

class GameViewController: UIViewController {



    override func viewDidLoad() {
        super.viewDidLoad()

    authenticateLocalPlayer()
}

 //initiate gamecenter
    func authenticateLocalPlayer(){
         print("Starting..1")
        let localPlayer = GKLocalPlayer.localPlayer()
         print("Starting..2")
        localPlayer.authenticateHandler = {(viewController, error) -> Void in
             print("Starting..3")
            if (viewController != nil) {
                print("Not signed in. Authenticating now")
                var vc = self.view?.window?.rootViewController
                vc?.presentViewController(viewController!, animated: true, completion: nil)
            }

            else {
                print((GKLocalPlayer.localPlayer().authenticated))

            }

        }
    }

GameScene:

import SpriteKit
import iAd
import GameKit

class GameScene: SKScene, SKPhysicsContactDelegate, ADBannerViewDelegate, GKGameCenterControllerDelegate {

  func saveHighscore(score:Int) {

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

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

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

            let scoreArray: [GKScore] = [scoreReporter]

            GKScore.reportScores(scoreArray, withCompletionHandler: {(error : NSError?) -> Void in
                if error != nil {
                    print("error")                }
            })

        }

    }

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

    //hides leaderboard screen
    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
    {
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)

    }

}

I also tried authenticating inside GameScene but that didn't work either.

Edit:

 //initiate gamecenter
    func authenticateLocalPlayer(){

         print("Gamecenter..1")
        let localPlayer = GKLocalPlayer.localPlayer()

         print("Gamecenter..2")
        localPlayer.authenticateHandler = {(viewController, error) -> Void in

             print("Gamecenter..3")
            if (viewController != nil) {
                print("Not signed in. Authenticating now")
                var vc = self.view?.window?.rootViewController
                vc?.presentViewController(viewController!, animated: true, completion: nil)
            }

            else {
                print((GKLocalPlayer.localPlayer().authenticated))

            }

        }
    }

Take a look at the print statements at the function above, "Gamecenter..3" never get printed.

Edit 2:

The problem solved itself when I signed out of Gamecenter. (How stupid this kind of stuff)

Abdou023
  • 1,654
  • 2
  • 24
  • 45
  • Have you enabled Game Center in Capabilities section in Xcode? – Adam Dec 09 '15 at 17:15
  • Yes, please take a look at my edited post. – Abdou023 Dec 09 '15 at 17:58
  • In sandbox mode, if you refuse to sign in 5 times, you can never sign in again until you remove your credentials from the game center settings in the system settings, then launch the app and sign back in – Knight0fDragon Dec 10 '15 at 02:01

1 Answers1

0

One possibility: In your authentication handler, you never check the error code. You only check if the viewController is set or not. If the error code is set, though, the viewController will (usually) be nil, so you could be interpreting a login error as a successful login.

I would change the code to:

localPlayer.authenticateHandler = {(viewController, error) -> Void in
    if (error != nil)
    {
         //add some stuff to report the error
    }
    else if (viewController != nil){
         print("Not signed in. Authenticating now")
         var vc = self.view?.window?.rootViewController
         vc?.presentViewController(viewController!, animated: true, completion: nil)
    }

   else {
         print((GKLocalPlayer.localPlayer().authenticated))

        }

   }

to confirm you're not getting an error on login. If you are getting an error, that will provide a clue as to what to look at next.

Edit

Some folks are reporting authentication problems until they add at least 1 leaderboard or achievement in iTunesConnect. In those reports, they're actually getting a login error that the game isn't recognized. But, given the inherent flakiness in game center, I would add a placeholder achievement or leaderboard to rule that issue out. (iOS9 “This game is not recognized by game center.”)

Community
  • 1
  • 1
Thunk
  • 4,099
  • 7
  • 28
  • 47