2

我在这里遇到了一个小问题,我希望有人能帮助我找出问题所在。

*下面介绍的测试项目可以在这里找到: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 的帮助。

4

2 回答 2

3

如您所见,如果 Game Center 身份验证对话框被取消 3 次,那么您无法在不重置设备的情况下将其恢复。

Game Center 中内置了另一个“安全功能”,如果用户在未离开应用程序的情况下已经取消对话框,则不允许应用程序重新进行身份验证。因此,要显示您的身份验证对话框,用户必须离开然后重新进入您的应用程序。

真的没有办法解决它。我在几个项目中所做的是向用户显示一条消息:

Game Center not available. Please make sure you are signed in through the Game Center app

如果 Game Center 不可用或用户未登录,我将在尝试进行身份验证后显示该消息。

于 2015-07-15T12:14:15.387 回答
1

如果您希望能够将其重新呈现给您的用户,请转到设置 -> 常规 -> 重置 -> -> 重置位置和隐私。

在此处输入图像描述

这将迫使 iOS 忘记应用程序的偏好,例如它们是否可以使用位置服务、向您发送推送通知以及游戏中心偏好。请记住,这将重置所有应用的隐私设置。

于 2015-07-15T15:27:59.097 回答