我在这里遇到了一个小问题,我希望有人能帮助我找出问题所在。
*下面介绍的测试项目可以在这里找到:http: //goo.gl/wz84aA (FR) 或https://goo.gl/0m8LrZ (Mega.NZ) *
我正在尝试向用户展示苹果为 GameCenter 功能提出的身份验证视图控制器。更准确地说,如果他第一次取消它,请重新呈现它。
我有一个带有这样故事板的游戏:
游戏导航控制器:
class GameNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("showAuthenticationViewController"), name: PresentAuthenticationViewController, object: nil)
GameKitHelper.sharedInstance.authenticateLocalPlayer()
}
func showAuthenticationViewController() {
let gameKitHelper = GameKitHelper.sharedInstance
if let authenticationViewController = gameKitHelper.authenticationViewController {
self.topViewController.presentViewController(authenticationViewController, animated: true, completion: nil)
}
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
菜单视图控制器:
class MenuViewController: UIViewController {
@IBAction func didTapLeaderboardBTN() {
// TRY 2
//if ( !GameKitHelper.sharedInstance.gameCenterEnabled) {
GameKitHelper.sharedInstance.authenticateLocalPlayer()
//} else {
GameKitHelper.sharedInstance.showGKGameCenterViewController(self)
//}
}
}
游戏工具包:
import GameKit
import Foundation
let PresentAuthenticationViewController = "PresentAuthenticationViewController"
let singleton = GameKitHelper()
class GameKitHelper: NSObject, GKGameCenterControllerDelegate {
var authenticationViewController: UIViewController?
var lastError: NSError?
var gameCenterEnabled: Bool
class var sharedInstance: GameKitHelper {
return singleton
}
override init() {
gameCenterEnabled = true
super.init()
}
func authenticateLocalPlayer () {
let localPlayer = GKLocalPlayer.localPlayer()
localPlayer.authenticateHandler = { (viewController, error) in
self.lastError = error
if viewController != nil {
self.authenticationViewController = viewController
NSNotificationCenter.defaultCenter().postNotificationName(PresentAuthenticationViewController, object: self)
} else if localPlayer.authenticated {
self.gameCenterEnabled = true
} else {
self.gameCenterEnabled = false
}
}
}
func showGKGameCenterViewController(viewController: UIViewController!) {
if ( !self.gameCenterEnabled ) {
println("Local player is not authenticated")
// TRY 1
//self.authenticateLocalPlayer()
return
}
let gameCenterViewController = GKGameCenterViewController()
gameCenterViewController.gameCenterDelegate = self
gameCenterViewController.viewState = .Leaderboards
viewController.presentViewController(gameCenterViewController, animated: true, completion: nil)
}
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!) {
gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}
}
目前正在工作的内容:
- 如果用户之前已登录(在 GameCenter 应用程序中),那么他可以打开排行榜视图;
- 如果用户未登录,则在加载游戏导航控制器时提示他登录(然后打开排行榜)。
当前不工作的内容:
- 如果他取消了 3 次身份验证,则身份验证将不再出现(即使在启动时);// 显然是一个已知的“问题”,而不是“可修复的”
- 如果用户取消他的身份验证,当他尝试加载排行榜时,身份验证将不会再次出现。
正如您在上面的注释代码中看到的那样,我尝试了 2-3 件事,但它们都不起作用;我无法再次显示身份验证视图。
PS:我的代码是用 Swift 编写的,但也欢迎使用 Objective-C 的帮助。