gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:15:19 25 4
gpt4 key购买 nike

目前,我的应用会提示用户在打开应用后立即登录 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com