Autenticar usando Game Center

Puedes usar Game Center para iniciar sesión en un juego de plataformas Apple creado en Firebase. Para usar Game Center Sign-in con Firebase, primero asegúrese de que el jugador local haya iniciado sesión con Game Center y luego use el objeto GameCenterAuthProvider para generar una credencial de Firebase, que puede usar para autenticarse con Firebase.

Antes de que empieces

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

  1. En Xcode, con el proyecto de su aplicación abierto, navegue hasta Archivo > Agregar paquetes .
  2. Cuando se le solicite, agregue el repositorio SDK de las plataformas Firebase Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Elija la biblioteca de autenticación de Firebase.
  5. Agregue el indicador -ObjC a la sección Otros indicadores del vinculador de la configuración de compilación de su objetivo.
  6. Cuando termine, Xcode comenzará automáticamente a resolver y descargar sus dependencias en segundo plano.

A continuación, realice algunos pasos de configuración:

  1. Asegúrate de registrar tu aplicación Apple en Firebase. Esto significa ingresar el ID del paquete de su aplicación en la sección de registro junto con información opcional adicional, como el ID de la App Store y el ID del equipo, etc. Esto será necesario para verificar de forma segura la audiencia de la credencial de Game Center del usuario antes de completar el inicio de sesión.
  2. Habilite Game Center como proveedor de inicio de sesión para su proyecto de Firebase:
    1. En Firebase console , abre la sección Autenticación .
    2. En la pestaña Método de inicio de sesión , habilite el proveedor de inicio de sesión de Game Center .

Integra el inicio de sesión de Game Center en tu juego

Primero, si su juego aún no usa Game Center, siga las instrucciones en Incorporación de Game Center a su juego y autenticación de un jugador local en el dispositivo en el sitio para desarrolladores de Apple.

Asegúrese de que el ID del paquete que proporciona a iTunes Connect coincida con el ID del paquete que utilizó cuando conectó su aplicación a su proyecto de Firebase.

Como parte de la integración de Game Center, usted define un controlador de autenticación que se llama en varios puntos del proceso de autenticación de Game Center. En este controlador, verifique si el jugador ha iniciado sesión en Game Center. Si es así, puedes continuar iniciando sesión en 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
  }
}

C objetivo

__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 con Firebase

Después de determinar que el jugador local ha iniciado sesión en Game Center, inicie sesión en su juego creando un objeto AuthCredential con GameCenterAuthProvider.getCredential() y pasando ese objeto a 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!
  }

C objetivo

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

Después de que un usuario inicia sesión por primera vez, se crea una nueva cuenta de usuario y se vincula a su ID de Game Center. Esta nueva cuenta se almacena como parte de su proyecto de Firebase y se puede usar para identificar a un usuario en cada aplicación de su proyecto.

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

C objetivo

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 las reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión a partir de la variable auth y usarlo para controlar a qué datos puede acceder un usuario.

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

Para cerrar la sesión de un usuario en Firebase, llame a Auth.signOut() :

Rápido

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

C objetivo

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