ios - 未登录 Game Center 时应用程序崩溃

标签 ios swift game-center

目前,我的应用会提示用户在打开应用后立即登录 Game Center。登录后,他们可以查看他们的成就和排行榜。然而;如果用户拒绝登录游戏中心,然后按下排行榜或成就按钮,整个应用程序就会崩溃。在这种情况下,应用程序应该做的是重新提示用户登录。任何建议将不胜感激。

class viewController: UIViewController, GKGameCenterControllerDelegate {

    var highscore = NSUserDefaults.standardUserDefaults().integerForKey("highscore")
    var loggedin = 1

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

    func login() {
        println("Game Center Login Called")
        let localPlayer = GKLocalPlayer.localPlayer()
        loggedin = 2

        // 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.")
            }
        }
    }

    func showLeaderboard() {
        let gkScore = GKScore(leaderboardIdentifier: "high_Score_Leader_Board")
        gkScore.value = Int64(highscore)
        GKScore.reportScores([gkScore], withCompletionHandler: ( { (error: NSError!) -> Void in
            if (error != nil) {
                // handle error
                println("Error: " + error.localizedDescription);
            } else {
                println("Score reported: \(gkScore.value)")
            }
        }))

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

        gcViewController.viewState = GKGameCenterViewControllerState.Leaderboards

        gcViewController.leaderboardIdentifier = "high_Score_Leader_Board"
        self.showViewController(gcViewController, sender: self)
        self.presentViewController(gcViewController, animated: true, completion: nil)
    }

    @IBAction func gameCenterButtoPressed(sender: AnyObject) {
        if loggedin == 2 {
            showLeaderboard()

        }

        else {
            login()
        }
    }

    @IBAction func pointButtonScored(sender: AnyObject) {
       ReportAchievment("testbutton", percentComplete: 100)
    }

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

    func showAchievements() {
        var gcViewController: GKGameCenterViewController = GKGameCenterViewController()
        gcViewController.gameCenterDelegate = self

        gcViewController.viewState = GKGameCenterViewControllerState.Achievements

        self.showViewController(gcViewController, sender: self)
        self.presentViewController(gcViewController, animated: true, completion: nil)
    }

    func ReportAchievment(identifier : String, percentComplete : Double)
    {
        var achievement = GKAchievement(identifier: identifier)

        if(achievement != nil)
        {
            achievement.percentComplete = percentComplete;
            achievement.showsCompletionBanner = true

            GKAchievement.reportAchievements([achievement], withCompletionHandler: { (error : NSError!) -> Void in
                println("Achievement reported")
            })
        }
    }

    @IBAction func achievementButtonPressed(sender: AnyObject) {

       showAchievements()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

最佳答案

这是我用来验证 Game Center 玩家身份的代码。您可以在游戏加载时调用 checkIfPlayerIsLoggedIn() 函数,这将检查玩家是否已登录。如果玩家未登录,它将移至 loginPlayer () 函数,如果已经设置了 Game Center,它将尝试让玩家登录,如果没有,它将显示 Game Center 登录屏幕。如果玩家选择不登录,它将返回一个错误,您可以从那里决定如何处理它(在您的情况下,这可能会告诉用户他们必须登录并再次尝试显示 View Controller )

let localPlayer = GKLocalPlayer.localPlayer()
var delegate: GameCenterInteractorNotifications?
var callingViewController: UIViewController?

func checkIfPlayerIsLoggedIn()
{
    if (self.localPlayer.authenticated == false)
    {
        self.loginPlayer()
    } else
    {
        self.localPlayer.registerListener(self)
        // Do achievement loading and matchmaking handling here
    }
}

private func loginPlayer()
{
    self.delegate?.willSignIn()

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

        if (viewController != nil)
        {
            dispatch_async(dispatch_get_main_queue(), {
                self.presentViewController(viewController, animated: true, completion: nil)
            })
        }

        else if (self.localPlayer.authenticated == true) // Player signed in
        {
            self.localPlayer.registerListener(self)
            self.delegate?.didSignIn()
        }

        else // Player did not sign in
        {
            self.delegate?.failedToSignIn()
        }

        if (error != nil)
        {
            println("Failed to sign in with error:\(error.localizedDescription).")
            self.delegate?.failedToSignInWithError(error)
            // Add code to determine what to do with the error
        }
    }
}

关于ios - 未登录 Game Center 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31923965/

相关文章:

ios - NSMutableDictionary - EXC BAD ACCESS - 同时读/写

ios - 游戏中心欢迎横幅不隐藏状态栏

iphone - 带游戏中心的回合制多人游戏

java - 如何在将 NSInputStream 写入 iOS 中的 NSOutputStream 时读取它?

ios - SwiftUI在无法推断时指定类型

ios - UITableView 单元格计数不足

ios - 刷新数据后 IBOutlet nil

ios - 在特定的 MKMapRect 中居中 MKAnnotation

ios - 如何判断这款iPhone是否支持Game Center挑战?

ios - Swift:除了单例,还有什么其他方式来存储 currentUser?