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