Anmeldung für Android-Spiele

Für den Zugriff auf die Funktionen der Google Play-Spieldienste muss dein Spiel das Konto des angemeldeten Spielers bereitstellen. In dieser Dokumentation wird beschrieben, wie du eine nahtlose Anmeldung in deinem Spiel implementierst.

Das Play-Spieldienste-SDK der Version 2 bietet eine Reihe von Verbesserungen, durch die die Anzahl der in deinem Spiel angemeldeten Nutzer erhöht und die Entwicklung vereinfacht wird:

  • Verbesserungen für Nutzer:
    • Nachdem ein Standardkonto ausgewählt wurde, sind Nutzer angemeldet, ohne auf eine Aufforderung reagieren zu müssen.
    • Nutzer müssen nicht mehr die Play Spiele App herunterladen, um sich über die Play-Spieldienste anzumelden oder ein neues Konto zu erstellen.
    • Nutzer können ihre Play-Spieldienste-Konten jetzt für mehrere Spiele auf einer einzigen Seite verwalten.
  • Verbesserungen für Entwickler:
    • Der Clientcode muss den An- oder Abmeldevorgang nicht mehr verarbeiten, da die Anmeldung automatisch ausgelöst wird, wenn das Spiel beginnt, und die Kontoverwaltung in den Einstellungen des Betriebssystems erfolgt.

Integration eines neuen Clients

In diesem Abschnitt wird beschrieben, wie du eine neue Clientintegration in Play-Spieldienste Sign In v2 vornimmst.

Abhängigkeit hinzufügen

Fügen Sie der Datei build.gradle auf Stammebene Ihrer App die Abhängigkeit vom Play Game Services SDK hinzu. Wenn Sie Gradle verwenden, können Sie die Abhängigkeit so hinzufügen oder aktualisieren:

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

Projekt-ID definieren

Führe die folgenden Schritte aus, um deiner App die Projekt-ID des Play Games Services SDK hinzuzufügen:

  1. Fügen Sie in der Datei AndroidManifest.xml Ihrer App dem <application>-Element das folgende <meta-data>-Element und die folgenden Attribute hinzu:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    

    Definieren Sie den String-Ressourcenverweis @string/game_services_project_id und verwenden Sie dabei die Projekt-ID der Spieldienste Ihres Spiels als Wert. Die Projekt-ID der Spieldienste finden Sie in der Google Play Console auf der Seite Konfiguration unter dem Spielnamen.

  2. Fügen Sie in der Datei res/values/strings.xml eine String-Ressourcenreferenz hinzu und legen Sie Ihre Projekt-ID als Wert fest. In der Google Play Console finden Sie Ihre Projekt-ID auf der Seite Konfiguration unter dem Namen des Spiels. Beispiele:

    <!-- res/values/strings.xml -->
    <resources>
      <!-- Replace 0000000000 with your game’s project id. Example value shown above.  -->
      <string translatable="false"  name="game_services_project_id"> 0000000000 </string>
    </resources>
    

SDK initialisieren

Initialisiere das Play Spiele SDK im onCreate(..)-Callback deiner Application-Klasse.

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

Anmeldeergebnis abrufen

Wenn dein Spiel gestartet wird, wird immer versucht, den Nutzer anzumelden. Um den Nutzer zu authentifizieren, musst du prüfen, ob er sich erfolgreich angemeldet hat, und dann seine Spieler-ID abrufen.

Um den Anmeldeversuch zu bestätigen, rufen Sie GamesSignInClient.isAuthenticated() auf und verwenden Sie addOnCompleteListener, um die Ergebnisse abzurufen. Beispiele:

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());

gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
  boolean isAuthenticated =
    (isAuthenticatedTask.isSuccessful() &&
     isAuthenticatedTask.getResult().isAuthenticated());

  if (isAuthenticated) {
    // Continue with Play Games Services
  } else {
    // Disable your integration with Play Games Services or show a
    // login button to ask  players to sign-in. Clicking it should
    // call GamesSignInClient.signIn().
  }
});

Wenn sich der Nutzer beim Start des Spiels nicht anmelden möchte, kann optional weiterhin eine Schaltfläche mit dem Play Spiele-Symbol angezeigt werden. Wenn der Nutzer auf die Schaltfläche drückt, kann er dann noch einmal versuchen, sich durch Aufrufen von GamesSignInClient.signIn() anzumelden.

Nachdem du bestätigt hast, dass der Nutzer angemeldet ist, kannst du die Spieler-ID abrufen, um den Nutzer zu identifizieren. Beispiele:

PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
    // Get PlayerID with mTask.getResult().getPlayerId()
  }
);
.

Zu Play-Spieldienste-Anmeldung v2 migrieren

In diesem Abschnitt wird beschrieben, wie du deinen Clientcode von Version 1 zu Version 2 der Play-Spieldienste migrierst.

Das neue SDK enthält vier wichtige Änderungen, die eine erfolgreiche Anmeldung ermöglichen:

  1. Die Anmeldung wird automatisch ausgelöst, wenn dein Spiel gestartet wird. Anstatt die GoogleSignInClient des GoogleSignIn SDK für die Anmeldung zu verwenden, können Sie GamesSignInClient.isAuthenticated() verwenden, um das Ergebnis des automatischen Anmeldeversuchs abzurufen.
  2. Client Factory-Klassen benötigen kein übergebenes GoogleSignInAccount-Objekt mehr. Zusätzliche OAuth-Bereiche können nicht angefordert werden (GAMES_LITE werden automatisch angefordert).
  3. Authentifizierungstoken werden jetzt mit GamesSignInClient.requestServerSideAccess() im Play Game Services SDK bereitgestellt.
  4. Die Abmeldemethode wurde entfernt und wir benötigen keine In-Game-Schaltfläche mehr, um sich in den Play-Spieldiensten an- oder abzumelden.

Außerdem müssen Sie sich in Ihrem Spiel anmelden, wenn es gestartet wird. Daher sollten Sie Ihre Kontingentverwaltung prüfen, damit Ihr Spiel das Kontingent für Anmeldeanfragen nicht überschreitet.

Targeting auf das neue SDK-Maven-Repository vornehmen

Wenn Sie das Gradle-Build-System verwenden, können Sie Ihre Abhängigkeit zum Artefakt com.google.android.gms:play-services-games-v2:+ in der build.gradle-Datei Ihres Moduls ändern. Beispiele:

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

SDK initialisieren

Initialisiere das Play Spiele SDK im onCreate(..)-Callback deiner Application-Klasse. Beispiele:

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

An- und Abmeldeanrufe entfernen

Wenn Sie keine zusätzlichen Bereiche angeben, sollte die Migration Ihres Anwendungsfalls einfach sein.

  1. Entfernen Sie Anmeldeaufrufe mithilfe der GoogleSignIn API. Die Anmeldung erfolgt immer beim Start des Spiels. Überwachen Sie stattdessen das Ergebnis des automatischen Anmeldeversuchs mit GamesSignInClient.isAuthenticated().

    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());
    
    gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
      boolean isAuthenticated =
        (isAuthenticatedTask.isSuccessful() &&
         isAuthenticatedTask.getResult().isAuthenticated());
    
      if (isAuthenticated) {
        // Continue with Play Games Services
      } else {
        // Disable your integration with Play Games Services or show a
        // login button to ask  players to sign-in. Clicking it should
        // call GamesSignInClient.signIn().
      }
    });
    
  2. Entfernen Sie alle Aufrufe zum Abmelden, da die Kontoverwaltung in den Einstellungen des Betriebssystems und der Play Spiele App enthalten ist.

  3. Wenn der Spieler angemeldet ist, entfernen Sie die Anmeldeschaltfläche für Play Spiele aus Ihrem Spiel. Wenn sich der Nutzer beim Start des Spiels nicht anmelden möchte, können Sie optional weiterhin eine Schaltfläche mit dem Play Spiele-Symbol anzeigen und den Anmeldevorgang mit GamesSignInClient.signIn() auslösen.

  4. Nachdem du überprüft hast, ob der Nutzer angemeldet ist, kannst du die Spieler-ID abrufen, um den Nutzer zu identifizieren.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
    .
  5. Entfernen Sie Ihre Abhängigkeit von der GoogleSignIn API, wenn sie nicht mehr verwendet wird.

Clientklassennamen aktualisieren

Verwenden Sie beim Erstellen von Clients (z.B. LeaderboardsClient oder AchievementsClient) PlayGames.getFooClient() statt Games.getFooClient().

Serverseitigen Zugriff anfordern

Wenn du den serverseitigen Zugriff anfragen möchtest, verwende GamesSignInClient.requestServerSideAccess() statt GoogleSignInAccount.getServerAuthCode().

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
gamesSignInClient
  .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID,
                           /*forceRefreshToken=*/ false)
  .addOnCompleteListener( task -> {
    if (task.isSuccessful()) {
      String serverAuthToken = task.getResult();
      // Send authentication code to the backend game server to be
      // exchanged for an access token and used to verify the
      // player via the Play Games Services REST APIs.
    } else {
      // Failed to retrieve authentication code.
    }
});

Zusätzliche Bereiche entfernen

Mit Play-Spieldienste v2 können Sie keine zusätzlichen Bereiche anfordern. Wenn Sie weitere Bereiche anfordern müssen, empfehlen wir, neben den Play-Spieldiensten das Google Sign In SDK zu verwenden.

Migration von GoogleApiClient

Bei älteren vorhandenen Integrationen hängt dein Spiel möglicherweise von der GoogleApiClient API-Variante des Play Games Services SDK ab. Dies wurde Ende 2017 eingestellt und durch "verbindungslose" Clients ersetzt. Für die Migration können Sie die Klasse GoogleApiClient durch ein „verbindungsloses“ Äquivalent ersetzen. Dann müssen Sie außerdem der oben stehenden Anleitung folgen, um Ihr Spiel von Version 1 zu Version 2 zu migrieren. Im Folgenden finden Sie eine Zuordnung gängiger Klassen:

com.google.android.gms.games.achievement.Achievements ->
    com.google.android.gms.games.AchievementsClient

com.google.android.gms.games.leaderboard.Leaderboard ->
    com.google.android.gms.games.LeaderboardsClient

com.google.android.gms.games.snapshot.Snapshots ->
    com.google.android.gms.games.SnapshotsClient

com.google.android.gms.games.stats.PlayerStats ->
    com.google.android.gms.games.PlayerStatsClient

com.google.android.gms.games.Players ->
    com.google.android.gms.games.PlayersClient

com.google.android.gms.games.GamesStatusCodes ->
    com.google.android.gms.games.GamesClientStatusCodes