Logowanie się w grach na Androida

Aby można było uzyskać dostęp do usług gier Google Play, gra musi mieć dostęp do konta zalogowanego gracza. Z tej dokumentacji dowiesz się, jak wdrożyć w grze bezproblemowe logowanie.

Pakiet SDK Usług gier Play w wersji 2 zawiera wiele ulepszeń, które zwiększają liczbę użytkowników zalogowanych w Twojej grze i ułatwiają jej tworzenie:

  • Ulepszenia dla użytkowników:
    • Po wybraniu konta domyślnego użytkownicy są zalogowani bez konieczności interakcji z prośbą.
    • Użytkownicy nie muszą już pobierać aplikacji Gry Play, aby logować się w usługach gier Play ani tworzyć nowego konta.
    • Użytkownicy mogą teraz zarządzać swoimi kontami usług gier Play w wielu grach na jednej stronie.
  • Ulepszenia dla deweloperów:
    • Kod klienta nie musi już obsługiwać procesu logowania ani wylogowywania, ponieważ logowanie jest uruchamiane automatycznie po uruchomieniu gry, a zarządzanie kontem odbywa się w ustawieniach systemu operacyjnego.

Integracja z nowym klientem

W tej sekcji dowiesz się, jak przeprowadzić nową integrację klienta z usługami gier Play Zaloguj się w wersji 2.

Dodaj zależność

Dodaj zależność z pakietu SDK usług gier Play do pliku build.gradle na poziomie głównym aplikacji. Jeśli używasz Gradle, możesz dodać lub zaktualizować zależność w ten sposób:

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

Zdefiniuj identyfikator projektu

Aby dodać do aplikacji identyfikator projektu z pakietu SDK usług gier Play, wykonaj te czynności:

  1. W pliku AndroidManifest.xml aplikacji dodaj do elementu <application> ten element <meta-data> i atrybuty:

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

    Zdefiniuj odwołanie do zasobu ciągu znaków @string/game_services_project_id, używając jako wartości identyfikatora projektu w usługach gier gier. Identyfikator projektu w usługach gier znajdziesz pod nazwą gry na stronie Konfiguracja w Konsoli Google Play.

  2. W pliku res/values/strings.xml dodaj odniesienie do zasobu w postaci ciągu znaków i ustaw identyfikator projektu jako wartość. W Konsoli Google Play identyfikator projektu znajdziesz pod nazwą gry na stronie Konfiguracja. Na przykład:

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

Zainicjuj pakiet SDK

Zainicjuj pakiet SDK Gier Play w wywołaniu zwrotnym onCreate(..) klasy Application.

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

...

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

Pobierz wynik logowania

Po uruchomieniu gry będzie ona zawsze próbowała zalogować użytkownika. Aby uwierzytelnić użytkownika, musisz sprawdzić, czy udało mu się zalogować, a potem uzyskać jego identyfikator gracza.

Aby zweryfikować próbę logowania, wywołaj GamesSignInClient.isAuthenticated() i użyj metody addOnCompleteListener, aby pobrać wyniki. Na przykład:

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().
  }
});

Jeśli użytkownik nie zdecyduje się na logowanie po uruchomieniu gry, możesz opcjonalnie nadal wyświetlać przycisk z ikoną Gier Play. Potem możesz spróbować zalogować użytkownika ponownie, wywołując GamesSignInClient.signIn(), gdy użytkownik go naciśnie.

Po sprawdzeniu, czy użytkownik jest zalogowany, możesz pobrać identyfikator odtwarzacza, aby go zidentyfikować. Na przykład:

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

Przejdź na logowanie w usługach gier Play w wersji 2

W tej sekcji dowiesz się, jak przenieść kod klienta z usług gier Play w wersji 1 do wersji 2.

Nowy pakiet SDK zawiera 4 główne zmiany, które ułatwią logowanie. O czym warto pamiętać:

  1. Logowanie jest uruchamiane automatycznie po uruchomieniu gry. Zamiast logować się za pomocą pakietu GoogleSignInClient pakietu GoogleSignIn SDK, możesz użyć pliku GamesSignInClient.isAuthenticated(), który umożliwi pobranie wyniku próby logowania automatycznego.
  2. Klasy fabryki klienta nie będą już potrzebować przekazywanego obiektu GoogleSignInAccount. Nie można zażądać dodatkowych zakresów OAuth (żądanie GAMES_LITE zostanie wysłane automatycznie).
  3. Tokeny uwierzytelniania są teraz dostarczane za pomocą GamesSignInClient.requestServerSideAccess() w pakiecie SDK usług gier Play.
  4. Usunęliśmy już tę metodę wylogowania i nie będziemy już potrzebować przycisku w grze, aby logować się w usługach gier Play lub wylogowywać się z nich.

Dodatkowo w grze będą pojawiać się dodatkowe logowanie dzięki logowaniu automatycznemu po jej premierze. Dlatego sprawdź zarządzanie limitem, aby mieć pewność, że Twoja gra nie przekracza limitu próśb o zalogowanie.

Ustaw kierowanie na nowe repozytorium SDK Maven

Jeśli używasz systemu kompilacji Gradle, możesz to zrobić, zmieniając zależność na artefakt com.google.android.gms:play-services-games-v2:+ w pliku build.gradle modułu. Na przykład:

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

Zainicjuj pakiet SDK

Zainicjuj pakiet SDK Gier Play w wywołaniu zwrotnym onCreate(..) klasy Application. Na przykład:

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

...

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

Usuń połączenia dotyczące logowania i wylogowania

Jeśli nie określisz dodatkowych zakresów, migracja danego przypadku użycia powinna być prosta.

  1. Usuń wywołania logowania za pomocą interfejsu GoogleSignIn API. Logowanie zawsze jest wykonywane w momencie uruchomienia gry. Zamiast tego nasłuchuj wyniku automatycznej próby logowania za pomocą 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. Usuń wszystkie wywołania wylogowania, ponieważ zarządzanie kontem odbywa się teraz w ustawieniach systemu operacyjnego i aplikacji Gry Play.

  3. Jeśli gracz się zalogował, usuń z gry przycisk logowania w Grach Play. Jeśli użytkownik nie zdecyduje się na logowanie po premierze gry, możesz nadal wyświetlać przycisk z ikoną Gier Play i uruchamiać proces logowania w GamesSignInClient.signIn().

  4. Po sprawdzeniu, czy użytkownik jest zalogowany, można pobrać identyfikator gracza, który umożliwi jego identyfikację.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. Usuń zależność od interfejsu GoogleSignIn API, jeśli nie jest już używana.

Zaktualizuj nazwy klas klienta

Podczas tworzenia klientów (np. LeaderboardsClient lub AchievementsClient) używaj PlayGames.getFooClient() zamiast Games.getFooClient().

Poproś o dostęp po stronie serwera

Gdy żądasz dostępu po stronie serwera, użyj zasady GamesSignInClient.requestServerSideAccess(), a nie 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.
    }
});

Usuń dodatkowe zakresy

W usługach gier Play w wersji 2 nie możesz prosić o dodatkowe zakresy. Jeśli nadal chcesz wysyłać prośby o dodatkowe zakresy, zalecamy używanie pakietu SDK Google Sign In razem z usługami gier Play.

Migracja z GoogleApiClient

W przypadku starszych integracji działanie gry może zależeć od wersji pakietu SDK usług gier Play w interfejsie GoogleApiClient API. Rozwiązanie to zostało wycofane pod koniec 2017 r. i zastąpione przez klienty bez połączenia. Aby przeprowadzić migrację, możesz zastąpić klasę GoogleApiClient odpowiednikiem „bez połączenia”. Musisz też zastosować się do powyższych wskazówek, aby przenieść grę z wersji 1 do wersji 2. Poniżej znajduje się mapowanie typowych klas:

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