再次出示 Game Center 认证
Posted
技术标签:
【中文标题】再次出示 Game Center 认证【英文标题】:Present GameCenter authenticationVC again 【发布时间】:2015-07-11 10:31:29 【问题描述】:我在这里遇到了一个小问题,希望有人能帮我找出问题所在。
*下面介绍的测试项目可以在这里找到: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)
//
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 应用中),那么他就可以打开排行榜视图; 如果用户未登录,则在加载游戏导航控制器时会提示他登录(然后打开排行榜)。目前没有什么工作:
如果他取消了三次认证,那么认证将不再出现(即使在启动时); // 显然是一个已知的“问题”,而不是“可修复的” 如果用户取消他的身份验证,当他尝试加载排行榜时,身份验证将不会再次出现。我尝试了 2-3 件事,正如您在上面的注释代码中看到的那样,但它们都不起作用;我无法让身份验证视图再次出现。
PS : 我的代码是用 Swift 编写的,但也欢迎对 Objective-C 的帮助。
【问题讨论】:
【参考方案1】:如您所见,如果 Game Center 身份验证对话框被取消 3 次,那么您无法在不重置设备的情况下将其恢复。
Game Center 内置了另一个“安全功能”,如果用户在未离开应用的情况下取消了对话框,则不允许应用重新进行身份验证。因此,要显示您的身份验证对话框,用户必须离开然后重新进入您的应用。
真的没有办法解决。我在几个项目中所做的是向用户显示一条消息:
Game Center not available. Please make sure you are signed in through the Game Center app
如果 Game Center 不可用或用户未登录,我将在尝试进行身份验证后显示该消息。
【讨论】:
【参考方案2】:如果您希望能够将其重新呈现给您的用户,请转到设置 -> 常规 -> 重置 -> -> 重置位置和隐私。
这将迫使 ios 忘记应用程序的偏好设置,例如它们是否可以使用位置服务、向您发送推送通知以及游戏中心偏好设置。请记住,这将重置所有应用的隐私设置。
【讨论】:
以上是关于再次出示 Game Center 认证的主要内容,如果未能解决你的问题,请参考以下文章
认证 (authentication) 和授权 (authorization) 的区别
认证 (authentication) 和授权 (authorization) 的区别