Autentica mediante Game Center

Puedes usar Game Center a fin de que los usuarios accedan a un juego para plataformas de Apple compilado en Firebase. Si quieres usar el acceso de Game Center con Firebase, primero asegúrate de que el jugador local haya accedido con Game Center y, luego, usa el objeto GameCenterAuthProvider para generar una credencial de Firebase, que puedes usar para autenticar con Firebase.

Antes de comenzar

Usa Swift Package Manager para instalar y administrar las dependencias de Firebase.

  1. En Xcode, con tu proyecto de app abierto, navega a File > Add Packages.
  2. Cuando se te solicite, agrega el repositorio del SDK de Firebase para plataformas de Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Elige la biblioteca de Firebase Authentication.
  5. Cuando termines, Xcode comenzará a resolver y descargar automáticamente tus dependencias en segundo plano.

A continuación, debes realizar los siguientes pasos de configuración:

  1. Asegúrate de registrar tu app para Apple con Firebase. Para ello, debes ingresar el ID del paquete de tu app en la sección de registro junto con información adicional opcional, como el ID de App Store, el ID de equipo, etc. Esto será obligatorio para verificar de manera segura el público de las credenciales de Game Center del usuario antes de completar el acceso.
  2. Habilita Game Center como proveedor de acceso para tu proyecto de Firebase de la siguiente manera:
    1. En Firebase console, abre la sección Authentication.
    2. En la pestaña Método de acceso, habilita el proveedor de acceso de Game Center.

Integra el acceso mediante Game Center en tu juego

Primero, si tu juego todavía no usa Game Center, sigue las instrucciones de los artículos sobre cómo incorporar Game Center en tu juego y autenticar un jugador local en el dispositivo del sitio para desarrolladores de Apple.

Asegúrate de que el ID del paquete que proporciones a iTunes Connect coincida con el que usaste para conectar tu app con el proyecto de Firebase.

Como parte de la integración en Game Center, debes definir un controlador de autenticación al que se realizan llamadas en varias etapas del proceso de autenticación de Game Center. En este controlador, verifica que el jugador haya accedido con Game Center. Si lo hizo, puedes continuar con el acceso a 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
  }
};

Autentica con Firebase

Tras confirmar que el jugador local accedió con Game Center, haz que acceda a tu juego. Para ello, crea un objeto AuthCredential mediante GameCenterAuthProvider.getCredential() y, a continuación, pásalo a 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óximos pasos

Cuando un usuario accede por primera vez, se crea una cuenta de usuario nueva y se vincula con su ID de Game Center. Esta cuenta nueva se almacena como parte de tu proyecto de Firebase y se puede usar para identificar a un usuario en todas las apps del proyecto.

En tu juego, puedes obtener el UID de Firebase del usuario desde el 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;
}

En tus reglas de seguridad de Firebase Realtime Database y Cloud Storage, puedes obtener el ID del usuario único que accedió a partir de la variable auth y usarlo para controlar a qué datos podrá acceder.

Para obtener la información de jugador de Game Center de un usuario o acceder a los servicios de Game Center, usa las API de Game Kit.

Para hacer que el usuario salga de Firebase, llama al métodoAuth.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;
}