2

У меня здесь проблема, и я надеюсь, что кто-то поможет мне разобраться в том, что не так.Настоящая идентификация GameCenterVC снова

* Тестовый проект, представленный ниже, можно найти здесь: 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 not available. Please make sure you are signed in through the Game Center app

Я укажу, что сообщение после попытки аутентификации и если Game Center не доступны или пользователь не подписанный.

1

Если вы хотите, чтобы иметь возможность повторно представить это своему пользователю, перейдите к настройкам -> Общие -> Сбросить -> -> Сбросить местоположение & Конфиденциальность.

enter image description here

Это заставит IOS забыть предпочтения для приложений, например, могут ли они использовать службы определения местоположения, отправлять push-уведомления, а также игровой центр предпочтений. Помните, что это приведет к сбросу настроек конфиденциальности для всех приложений.

Смежные вопросы