再次出示 Game Center 身份验证
Present GameCenter authenticationVC again
我遇到了一个小问题,希望有人能帮我找出问题所在。
*下面给出的测试项目可以在这里找到:http://goo.gl/wz84aA (FR) or https://goo.gl/0m8LrZ (Mega.NZ) *
我正在尝试向用户展示 apple 为 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)
//}
}
}
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)
}
}
目前正在做什么:
- 如果用户之前已登录(在 GameCenter 应用程序中),则他可以打开排行榜视图;
- 如果用户未登录,则在加载游戏导航控制器时会提示他登录(然后打开排行榜)。
当前无效的内容:
- 如果他取消三次认证,那么认证将不再出现(即使在启动时); // 显然是已知的 "problem",而不是 "fixable"
- 如果用户取消他的身份验证,当他尝试加载排行榜时,身份验证将不会再次出现。
我尝试了 2-3 种方法,如您在上面的注释代码中所见,但其中 none 种方法有效;我无法再次显示身份验证视图。
PS : 我的代码是用 Swift 编写的,但也欢迎在 Objective-C 中提供帮助。
如您所知,如果 Game Center 身份验证对话框被取消 3 次,那么您必须重置设备才能将其恢复。
Game Center 中内置了另一个 "security feature",如果用户在未离开应用程序的情况下取消了对话框,则不允许应用程序重新验证。因此,要显示您的身份验证对话框,用户必须离开然后重新进入您的应用程序。
实在是没办法。我在几个项目中所做的是向用户显示一条消息:
Game Center not available. Please make sure you are signed in through the Game Center app
我会在尝试验证后显示该消息,如果 Game Center 不可用或用户未登录。
如果您希望能够向您的用户重新呈现此信息,请转至设置 -> 常规 -> 重置 -> -> 重置位置和隐私。
这将强制 iOS 忘记应用的首选项,例如它们是否可以使用位置服务、向您发送推送通知以及游戏中心首选项。请记住,这将重置所有应用的隐私设置。
我遇到了一个小问题,希望有人能帮我找出问题所在。
*下面给出的测试项目可以在这里找到:http://goo.gl/wz84aA (FR) or https://goo.gl/0m8LrZ (Mega.NZ) *
我正在尝试向用户展示 apple 为 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)
//}
}
}
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)
}
}
目前正在做什么:
- 如果用户之前已登录(在 GameCenter 应用程序中),则他可以打开排行榜视图;
- 如果用户未登录,则在加载游戏导航控制器时会提示他登录(然后打开排行榜)。
当前无效的内容:
- 如果他取消三次认证,那么认证将不再出现(即使在启动时); // 显然是已知的 "problem",而不是 "fixable"
- 如果用户取消他的身份验证,当他尝试加载排行榜时,身份验证将不会再次出现。
我尝试了 2-3 种方法,如您在上面的注释代码中所见,但其中 none 种方法有效;我无法再次显示身份验证视图。
PS : 我的代码是用 Swift 编写的,但也欢迎在 Objective-C 中提供帮助。
如您所知,如果 Game Center 身份验证对话框被取消 3 次,那么您必须重置设备才能将其恢复。
Game Center 中内置了另一个 "security feature",如果用户在未离开应用程序的情况下取消了对话框,则不允许应用程序重新验证。因此,要显示您的身份验证对话框,用户必须离开然后重新进入您的应用程序。
实在是没办法。我在几个项目中所做的是向用户显示一条消息:
Game Center not available. Please make sure you are signed in through the Game Center app
我会在尝试验证后显示该消息,如果 Game Center 不可用或用户未登录。
如果您希望能够向您的用户重新呈现此信息,请转至设置 -> 常规 -> 重置 -> -> 重置位置和隐私。
这将强制 iOS 忘记应用的首选项,例如它们是否可以使用位置服务、向您发送推送通知以及游戏中心首选项。请记住,这将重置所有应用的隐私设置。