2015-07-11 36 views
2

我在這裏面臨一個小問題,我希望有人能幫我弄清楚什麼是錯的。再次出現GameCenter驗證碼

*下面介紹可以在這裏找到測試項目:http://goo.gl/wz84aA(FR)或https://goo.gl/0m8LrZ(Mega.NZ)*

我想呈現給用戶的GameCenter的提議通過蘋果認證的視圖控制器特徵。更確切地說,如果他第一次取消它,請重新提交。

我有一個遊戲一樣,故事板:

Storyboard

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) 
    } 
} 

什麼是目前的工作:

  • 如果用戶事先登錄(GameCenter的在應用程序中),那麼他能夠打開排行榜視圖;
  • 如果用戶未登錄,那麼當遊戲導航控制器加載(然後打開排行榜)時,系統會提示他登錄。

究竟是不是目前的工作:

  • 如果他取消三個時間的認證,那麼認證將不再(甚至在發射)出現; //顯然已知的「問題」,而不是「可以解決的」
  • 如果用戶取消其認證,當他試圖加載認證將不會再出現在領先榜上。

我嘗試了2-3件事情,你可以在上面的註釋代碼中看到,但它們都不工作;我無法使認證視圖再次出現。

PS:我的代碼是用Swift編寫的,但Objective-C的幫助也很受歡迎。

回答

2

正如您發現的那樣,如果Game Center認證對話框被取消3次,那麼無需重置設備即可將其取回。

Game Center中內置了另一個「安全功能」,如果用戶在不離開應用程序的情況下已經取消對話,則不允許應用程序重新進行身份驗證。因此,要顯示驗證對話框,用戶必須先離開然後重新輸入您的應用程序。

真的沒有辦法繞過它。我已經在幾個項目做的是顯示一條消息給用戶:

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

我會嘗試進行身份驗證後,如果遊戲中心不可用,或者用戶不表明消息登錄。

1

如果您希望能夠將其重新呈現給您的用戶,請轉至設置 - >常規 - >重置 - > - >重置位置&隱私。

enter image description here

這將迫使iOS系統忘記的應用程序,例如他們是否可以使用位置服務的喜好,給你推送通知,也遊戲中心的喜好。請記住,這會重置所有應用的隱私設置。