我在这里面临一个小问题,我希望有人能帮助我找出问题所在。
*下面的测试项目可以在这里找到:http://goo.gl/wz84aA(FR)或https://goo.gl/0m8LrZ(Mega.NZ)*
我试图向用户呈现Apple为GameCenter功能提出的身份验证视图控制器。更确切地说,如果他第一次取消它,重新呈现它。
我有一个类似故事板的游戏:
GameNavigationController:
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)
}
}
MenuViewController:
class MenuViewController: UIViewController {
@IBAction func didTapLeaderboardBTN() {
// TRY 2
//if ( !GameKitHelper.sharedInstance.gameCenterEnabled) {
GameKitHelper.sharedInstance.authenticateLocalPlayer()
//} else {
GameKitHelper.sharedInstance.showGKGameCenterViewController(self)
//}
}
}
GameKitHelper:
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)
}
}
目前有效:
目前没有工作的内容:
我在上面的注释代码中看到了2-3个东西,但是没有一个正在工作;我无法再次显示身份验证视图。
PS:我的代码是用Swift编写的,但是对Objective-C的帮助也很受欢迎。
答案 0 :(得分:2)
如您所知,如果Game Center身份验证对话框被取消3次,那么您无法在不重置设备的情况下将其恢复。
还有另一个"安全功能"内置于游戏中心,如果用户已经取消对话而不离开应用程序,则不允许应用重新进行身份验证。因此,要显示您的身份验证对话框,用户必须离开然后重新输入您的应用。
真的没办法解决它。我在几个项目中所做的就是向用户显示一条消息:
Game Center not available. Please make sure you are signed in through the Game Center app
我会在尝试进行身份验证后显示该消息,以及Game Center是否可用或用户未登录。
答案 1 :(得分:1)
如果您希望能够将此重新呈现给您的用户,请转到设置 - >一般 - >重置 - > - >重置位置&隐私。
这将迫使iOS忘记应用的偏好,例如他们是否可以使用位置服务,发送推送通知以及游戏中心首选项。请注意,这会重置所有应用的隐私设置。