Autenticar usando o Game Center

Você pode usar o Game Center para conectar jogadores em um jogo de plataformas Apple criado no Firebase. Para usar o login do Game Center com o Firebase, primeiro certifique-se de que o jogador local esteja conectado ao Game Center e, em seguida, use o objeto GameCenterAuthProvider para gerar uma credencial do Firebase, que você pode usar para autenticar com o Firebase.

Antes de você começar

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

  1. No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .
  2. Quando solicitado, adicione o repositório SDK das plataformas Apple do Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Escolha a biblioteca Firebase Authentication.
  5. Adicione o sinalizador -ObjC à seção Outros sinalizadores de vinculador das configurações de compilação do seu destino.
  6. Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.

A seguir, execute algumas etapas de configuração:

  1. Certifique-se de registrar seu aplicativo Apple no Firebase. Isso significa inserir o ID do pacote do seu aplicativo na seção de registro junto com informações opcionais adicionais, como ID da App Store e ID da equipe, etc. Isso será 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 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 , habilite o provedor de login do Game Center .

Integre o login do Game Center ao seu jogo

Primeiro, se o seu jogo ainda não usa o Game Center, siga as instruções em Incorporando o Game Center ao seu jogo e Autenticando um jogador local no dispositivo no site do desenvolvedor da Apple.

Verifique se o ID do pacote fornecido ao iTunes Connect corresponde ao ID do pacote usado quando conectou o aplicativo ao projeto do Firebase.

Como parte da integração do Game Center, você define um manipulador de autenticação que é chamado em vários pontos do processo de autenticação do Game Center. Neste manipulador, verifique se o jogador está conectado ao Game Center. Nesse caso, você pode continuar fazendo login no Firebase.

Rápido

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

Objetivo-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 com Firebase

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

Rápido

// 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!
  }

Objetivo-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óximos passos

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

No seu jogo, você pode obter o UID do Firebase do usuário no objeto User :

Rápido

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
}

Objetivo-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, você pode obter o ID de usuário exclusivo do usuário conectado na variável auth e usá-lo para controlar quais dados um usuário pode acessar.

Para obter informações de jogador do Game Center de um usuário ou acessar os serviços do Game Center, use as APIs fornecidas pelo Game Kit .

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

Rápido

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

Objetivo-C

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