Mit Game Center authentifizieren

Sie können das Game Center verwenden, um Spieler für ein Spiel der Apple-Plattform anzumelden, das auf Firebase basiert. Wenn Sie die Game Center-Anmeldung mit Firebase verwenden möchten, prüfen Sie zuerst, ob der lokale Spieler im Game Center angemeldet ist. Verwenden Sie dann das GameCenterAuthProvider-Objekt, um Firebase-Anmeldedaten zu generieren, mit denen Sie sich bei Firebase authentifizieren können.

Hinweis

Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.

  1. Gehen Sie in Xcode bei geöffnetem App-Projekt zu File > Pakete hinzufügen.
  2. Fügen Sie bei entsprechender Aufforderung das Firebase Apple Platforms SDK-Repository hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wählen Sie die Bibliothek Firebase Authentication aus.
  5. Fügen Sie das Flag -ObjC dem Bereich Other Linker Flags der Build-Einstellungen des Ziels hinzu.
  6. Wenn Sie fertig, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.

Führen Sie als Nächstes einige Konfigurationsschritte aus:

  1. Registrieren Sie Ihre Apple-App bei Firebase. Das bedeutet, dass Sie Ihre die Bundle-ID der App im Registrierungsbereich sowie zusätzliche optionale wie die App Store-ID und die Team-ID usw. Zielgruppe der Game Center-Anmeldedaten des Nutzers vor dem der Anmeldung.
  2. So aktivieren Sie Game Center als Anmeldeanbieter für Ihr Firebase-Projekt:
    1. Öffnen Sie in der Firebase Console den Bereich Authentifizierung.
    2. Aktivieren Sie auf dem Tab Anmeldemethode den Anmeldeanbieter Game Center.

Game Center-Anmeldung in Ihr Spiel einbinden

Wenn Sie das Game Center noch nicht für Ihr Spiel nutzen, folgen Sie der Anleitung in Einbindung des Game Centers in Ihr Spiel und Lokalen Player auf dem Gerät authentifizieren auf dem Apple Website für Entwickler.

Die Bundle-ID, die Sie bei iTunes Connect angeben, muss mit der Bundle-ID übereinstimmen, die Sie verwendet haben, als Sie Ihre App mit Ihrem Firebase-Projekt verknüpft haben.

Im Rahmen Ihrer Game Center-Integration definieren Sie einen Authentifizierungs-Handler, der an mehreren Stellen im Game Center-Authentifizierungsprozess aufgerufen wird. Prüfe in diesem Handler, ob der Spieler im Game Center angemeldet ist. Falls ja, können Sie melden Sie sich in Firebase an.

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

Mit Firebase authentifizieren

Nachdem du festgestellt hast, dass sich der lokale Spieler mit dem Game Center angemeldet hat, kannst du ihn in deinem Spiel anmelden. Erstelle dazu ein AuthCredential-Objekt mit GameCenterAuthProvider.getCredential() und übergebe es an 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.
    }];
  }
}];

Nächste Schritte

Nachdem sich ein Nutzer zum ersten Mal angemeldet hat, wird ein neues Nutzerkonto erstellt und die mit ihrer Game Center-ID verknüpft sind. Dieses neue Konto wird als Teil deiner Firebase-Projekt erstellen und zur Identifizierung von Nutzern in jeder App in Ihrem Projekt arbeiten.

In Ihrem Spiel können Sie die Firebase-UID des Nutzers aus dem User-Objekt abrufen:

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

In Ihren Firebase Realtime Database- und Cloud Storage-Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen auth abrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.

Informationen zu Game Center-Spielern eines Nutzers abrufen oder auf das Game Center zugreifen verwenden, nutzen Sie die von Game Kit bereitgestellten APIs.

Rufen Sie Auth.signOut() auf, um einen Nutzer von Firebase abzumelden:

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