Autenticar usando o Game Center

É possível usar o Game Center para fazer login de jogadores em um jogo para plataformas Apple criado com o Firebase. Para usar o login do Game Center com o Firebase, primeiro verifique se o jogador local está conectado ao Game Center e, em seguida, use o objeto GameCenterAuthProvider para gerar uma credencial do Firebase, que você pode usar para autenticar no Firebase.

Antes de começar

Use o Swift Package Manager para instalar e gerenciar as dependências do Firebase.

  1. No Xcode, com seu projeto do app aberto, navegue até File > Add Packages.
  2. Quando solicitado, adicione o repositório do SDK do Firebase para as plataformas da Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Escolha a biblioteca do Firebase Authentication.
  5. Quando terminar, o Xcode começará a resolver e fazer o download das dependências em segundo plano automaticamente.

Em seguida, execute algumas etapas de configuração:

  1. Registre seu app para Apple no Firebase. Para isso, digite o ID do pacote do app na seção de registro, além de outras informações opcionais, como o ID da App Store e o ID da equipe etc. Isso é necessário para verificar com segurança o público da credencial do Game Center do usuário antes de concluir o login.
  2. Ative o Game Center como um provedor de login para seu projeto do Firebase:
    1. No Console do Firebase, abra a seção Autenticação.
    2. Na guia Método de login, ative o provedor de entrada do Game Center.

Integrar o login do Game Center ao seu jogo

Primeiro, caso seu jogo ainda não use o Game Center, siga as instruções em Como incorporar o Game Center ao seu jogo e Como autenticar um jogador local no dispositivo (ambos em inglês) no site de desenvolvedores da Apple.

Verifique se o ID do pacote que você fornece ao iTunes Connect corresponde ao ID que você usou ao conectar seu aplicativo ao projeto do Firebase.

Como parte da integração do Game Center, você define um gerenciador de autenticação que é chamado em vários pontos no processo de autenticação do Game Center. Nele, verifique se o jogador está conectado ao Game Center. Em caso afirmativo, continue com o login no Firebase.

Swift

let localPlayer = GKLocalPlayer.localPlayer()
localPlayer.authenticateHandler = { (gcAuthViewController?, error) in
  if let gcAuthViewController = gcAuthViewController {
    // Pause any activities that require user interaction, then present the
    // gcAuthViewController to the player.
  } else if localPlayer.isAuthenticated {
    // Player is signed in to Game Center. Get Firebase credentials from the
    // player's Game Center credentials (see below).
  } else {
    // Error
  }
}

Objective-C

__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *gcAuthViewController,
                                    NSError *error) {
  if (gcAuthViewController != nil) {
    // Pause any activities that require user interaction, then present the
    // gcAuthViewController to the player.
  } else if (localPlayer.isAuthenticated) {
    // Player is signed in to Game Center. Get Firebase credentials from the
    // player's Game Center credentials (see below).
  } else {
    // Error
  }
};

Autenticar no Firebase

Depois de determinar que o jogador local fez login no Game Center, faça login no seu jogo criando um objeto AuthCredential com GameCenterAuthProvider.getCredential() e transmitindo esse objeto para signIn(with:):

Swift

// Get Firebase credentials from the player's Game Center credentials
GameCenterAuthProvider.getCredential() { (credential, error) in
  if let error = error {
    return
  }
  // The credential can be used to sign in, or re-auth, or link or unlink.
  Auth.auth().signIn(with:credential) { (user, error) in
    if let error = error {
      return
    }
    // Player is signed in!
  }

Objective-C

// Get Firebase credentials from the player's Game Center credentials
[FIRGameCenterAuthProvider getCredentialWithCompletion:^(FIRAuthCredential *credential,
                                                         NSError *error) {
  // The credential can be used to sign in, or re-auth, or link or unlink.
  if (error == nil) {
    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRUser *user, NSError *error) {
      // If error is nil, player is signed in.
    }];
  }
}];

Próximas etapas

Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é criada e vinculada ao ID do Game Center. Ela é armazenada como parte do seu projeto do Firebase e pode ser usada para identificar um usuário em cada app no seu projeto.

No seu jogo, é possível receber o UID do Firebase referente ao usuário usando o objeto User:

Swift

let user = Auth.auth().currentUser
if let user = user {
  let playerName = user.displayName

  // The user's ID, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server,
  // if you have one. Use getToken(with:) instead.
  let uid = user.uid
}

Objective-C

FIRUser *user = [FIRAuth auth].currentUser;
if (user) {
  NSString *playerName = user.displayName;

  // The user's ID, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server,
  // if you have one. Use getTokenWithCompletion:completion: instead.
  NSString *uid = user.uid;
}

Nas regras de segurança do Firebase Realtime Database e do Cloud Storage, é possível usar a variável auth para acessar o ID exclusivo do usuário que fez login. Use essa informação para controlar quais dados os usuários podem acessar.

Para ver informações de um jogador do Game Center ou acessar os serviços do Game Center, use as APIs fornecidas pelo Game Kit (em inglês).

Para desconectar um usuário do Firebase, chame Auth.signOut():

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}