Swift SpriteKit-Can';t登录到游戏中心

Swift SpriteKit-Can';t登录到游戏中心,swift,sprite-kit,game-center,Swift,Sprite Kit,Game Center,我在itunes connect方面做得很好,但当我启动应用程序时,它不会进行身份验证,当我按下Gamecenter按钮时,它会给我一条消息“Gamecenter不可用,用户未登录” 代码: 视图控制器: import UIKit import SpriteKit import GameKit class GameViewController: UIViewController { override func viewDidLoad() { super.viewD

我在itunes connect方面做得很好,但当我启动应用程序时,它不会进行身份验证,当我按下Gamecenter按钮时,它会给我一条消息“Gamecenter不可用,用户未登录” 代码:

视图控制器:

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))

            }

        }
    }
游戏场景:

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)

    }

}
我还尝试在
游戏场景中进行身份验证,但也没有成功

编辑:

看看上面函数中的
print
语句,“Gamecenter..3”永远不会被打印

编辑2:


当我退出游戏中心时,问题自行解决了。(这种东西多么愚蠢)

一种可能性是:在身份验证处理程序中,您从不检查错误代码。仅检查是否设置了viewController。但是,如果设置了错误代码,viewController(通常)将为零,因此您可以将登录错误解释为成功登录

我会将代码更改为:

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))

        }

   }
以确认登录时没有出现错误。如果你遇到了一个错误,这将提供一个关于下一步要看什么的线索

编辑


有些人报告身份验证问题,直到他们在iTunesConnect中添加至少一个排行榜或成就。在这些报告中,他们实际上得到了一个登录错误,游戏无法识别。但是,考虑到game center固有的弱点,我会添加一个占位符成就或排行榜来排除这个问题。()

您是否在Xcode的“功能”部分启用了Game Center?是的,请查看我编辑的帖子。在沙箱模式下,如果您拒绝登录5次,您将无法再次登录,除非您从“系统设置”中的“Game Center”设置中删除凭据,然后启动应用程序并重新登录,无错误。请看我编辑的帖子。
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))

        }

   }