Đăng nhập vào các trò chơi trên Android

Để truy cập chức năng Dịch vụ trò chơi của Google Play, trò chơi của bạn cần cung cấp tài khoản người chơi đã đăng nhập. Tài liệu này mô tả cách triển khai trải nghiệm đăng nhập liền mạch trong trò chơi của bạn.

SDK Dịch vụ trò chơi của Play phiên bản 2 mang đến một vài điểm cải tiến giúp tăng số lượng người dùng đăng nhập vào trò chơi của bạn, đồng thời tạo điều kiện cho việc phát triển dễ dàng hơn:

  • Những cải tiến cho người dùng:
    • Sau khi chọn một tài khoản mặc định, người dùng sẽ đăng nhập mà không cần tương tác với các lời nhắc.
    • Người dùng không cần phải tải Ứng dụng Play Games xuống để đăng nhập bằng Dịch vụ trò chơi của Play, hoặc tạo một tài khoản mới khác.
    • Giờ đây, người dùng có thể quản lý tài khoản Dịch vụ trò chơi của Play cho nhiều trò chơi từ một trang.
  • Cải tiến dành cho các nhà phát triển:
    • Mã ứng dụng khách không còn cần xử lý luồng đăng nhập hoặc đăng xuất nữa, vì việc đăng nhập sẽ tự động kích hoạt khi trò chơi bắt đầu, đồng thời hoạt động quản lý tài khoản được xử lý trong các chế độ cài đặt hệ điều hành.

Tích hợp ứng dụng mới

Phần này sẽ hướng dẫn cách tích hợp ứng dụng mới với SDK Đăng nhập Dịch vụ trò chơi của Play phiên bản 2.

Thêm phần phụ thuộc

Thêm phần phụ thuộc SDK Dịch vụ trò chơi của Play vào tệp build.gradle gốc của ứng dụng. Nếu đang sử dụng Gradle, bạn có thể thêm hoặc cập nhật phần phụ thuộc như bên dưới:

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

Xác định mã dự án

Để thêm mã dự án SDK dịch vụ trò chơi của Play vào ứng dụng, hãy hoàn tất các bước sau:

  1. Trong tệp AndroidManifest.xml của ứng dụng, hãy thêm các thuộc tính và phần tử <meta-data> sau đây vào phần tử <application>:

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

    Xác định tham chiếu tài nguyên chuỗi @string/game_services_project_id bằng cách sử dụng mã dự án Dịch vụ trò chơi của trò chơi làm giá trị. Bạn có thể tìm thấy mã dự án dịch vụ trò chơi trong tên trò chơi tại trang Cấu hình trên Google Play Console.

  2. Trong tệp res/values/strings.xml, hãy thêm một tham chiếu tài nguyên chuỗi và đặt mã dự án làm giá trị. Trong Google Play Console, bạn có thể tìm thấy mã dự án bên dưới tên trò chơi ở trang Cấu hình. Ví dụ:

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

Khởi chạy SDK

Khởi chạy SDK Play Games trong lệnh gọi lại onCreate(..) của lớp Application.

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

...

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

Tải kết quả đăng nhập

Khi phát hành, trò chơi sẽ luôn cố gắng đăng nhập người dùng vào trò chơi. Để xác thực người dùng, bạn phải xác minh người dùng đã đăng nhập thành công, sau đó lấy Mã người chơi của họ.

Để xác minh hoạt động đăng nhập, hãy gọi GamesSignInClient.isAuthenticated() và sử dụng addOnCompleteListener để truy xuất kết quả. Ví dụ:

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

Nếu người dùng chọn không đăng nhập khi trò chơi khởi động, bạn có thể tuỳ ý chọn chức năng tiếp tục hiển thị một nút có biểu tượng Play Games, sau đó thử đăng nhập lại người dùng vào trò chơi bằng cách gọi GamesSignInClient.signIn() nếu người dùng nhấn nút.

Sau khi xác minh người dùng đã đăng nhập, bạn có thể truy xuất Mã nhận dạng người chơi để xác định người dùng. Ví dụ:

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

Di chuyển sang SDK Đăng nhập Dịch vụ trò chơi của Play phiên bản 2

Phần này mô tả cách di chuyển mã ứng dụng của bạn từ Dịch vụ trò chơi của Play phiên bản 1 sang phiên bản 2.

Bạn cần lưu ý 4 thay đổi lớn trong SDK mới để tăng khả năng đăng nhập thành công:

  1. Tính năng đăng nhập sẽ được kích hoạt tự động khi trò chơi của bạn khởi động. Thay vì sử dụng GoogleSignInClient của SDK GoogleSignIn để thực hiện quá trình đăng nhập, bạn có thể sử dụng GamesSignInClient.isAuthenticated() để tìm nạp kết quả của lần đăng nhập tự động.
  2. Các lớp nhà máy của ứng dụng (Client Factory) sẽ không cần truyền đối tượng GoogleSignInAccount nữa. Không thể yêu cầu phạm vi OAuth bổ sung (GAMES_LITE sẽ tự động yêu cầu).
  3. Giờ đây, mã thông báo xác thực được cung cấp qua GamesSignInClient.requestServerSideAccess() trong SDK Dịch vụ trò chơi của Play.
  4. Phương thức đăng xuất sẽ bị xoá và chúng tôi sẽ không yêu cầu nút (trong trò chơi) để đăng nhập hoặc đăng xuất khỏi Dịch vụ trò chơi của Play.

Ngoài ra, trò chơi của bạn sẽ gặp phải tình trạng đăng nhập bổ sung do việc đăng nhập tự động khi trò chơi khởi động. Do đó, bạn nên xem lại mục quản lý hạn mức để đảm bảo trò chơi của bạn không vượt quá hạn mức yêu cầu đăng nhập.

Nhắm đến kho lưu trữ SDK Maven mới

Nếu đang sử dụng hệ thống bản dựng Gradle, bạn có thể thực hiện bằng cách thay đổi phần phụ thuộc thành cấu phần phần mềm com.google.android.gms:play-services-games-v2:+ trong tệp build.gradle của mô-đun. Ví dụ:

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

Khởi chạy SDK

Khởi chạy SDK Play Games trong lệnh gọi lại onCreate(..) của lớp Application. Ví dụ:

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

...

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

Xoá lệnh gọi đăng nhập và đăng xuất

Nếu bạn chỉ định không có phạm vi bổ sung, việc di chuyển trường hợp sử dụng của bạn sẽ khá đơn giản.

  1. Dùng GoogleSignIn API để xoá lệnh gọi đăng nhập. Việc đăng nhập sẽ luôn được thực hiện khi khởi động trò chơi. Thay vào đó, hãy theo dõi kết quả của lần đăng nhập tự động bằng 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. Hãy xoá tất cả các cuộc gọi để đăng xuất, vì hoạt động quản lý tài khoản hiện nằm trong tuỳ chọn cài đặt ứng dụng Play và hệ điều hành.

  3. Nếu người chơi đã đăng nhập thành công, vui lòng xoá nút đăng nhập vào Play Games khỏi trò chơi của bạn. Nếu người dùng chọn không đăng nhập khi trò chơi khởi động, bạn có thể chọn tiếp tục hiển thị nút có biểu tượng Play Games và kích hoạt quy trình đăng nhập với GamesSignInClient.signIn().

  4. Sau khi xác minh người dùng đã đăng nhập, bạn có thể truy xuất Mã nhận dạng người chơi để xác định người dùng.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. Hãy xoá phần phụ thuộc trên API GoogleSignIn nếu không còn dùng đến

Cập nhật tên lớp ứng dụng

Khi tạo ứng dụng (chẳng hạn như LeaderboardsClient hoặc AchievementsClient), vui lòng sử dụng PlayGames.getFooClient() thay vì Games.getFooClient().

Yêu cầu quyền truy cập phía máy chủ

Khi yêu cầu quyền truy cập phía máy chủ, vui lòng sử dụng GamesSignInClient.requestServerSideAccess() thay vì 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.
    }
});

Xoá các phạm vi thừa

Với Dịch vụ trò chơi của Play phiên bản 2, bạn không thể yêu cầu thêm phạm vi nào. Nếu có nhu cầu thêm phạm vi, bạn nên sử dụng SDK đăng nhập bằng Google cùng với Dịch vụ trò chơi của Play.

Di chuyển từ GoogleApiClient

Đối với các chế độ tích hợp hiện có từ trước, có thể trò chơi đang phụ thuộc vào biến thể API GoogleApiClient thuộc SDK Dịch vụ trò chơi của Play. Biến thể này đã ngừng hoạt động từ cuối năm 2017, và được thay thế bằng các ứng dụng “không có kết nối” (connectionless). Để di chuyển, bạn có thể thay thế lớp GoogleApiClient bằng một lớp tương đương “không có kết nối”. Sau đó, bạn sẽ phải làm theo hướng dẫn ở trên để di chuyển trò chơi từ phiên bản 1 sang phiên bản 2. Dưới đây là bản đồ ánh xạ các lớp phổ biến:

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