使用 Game Center 进行身份验证

您可以使用 Game Center,让玩家登录基于 Firebase 构建的 Apple 平台游戏。要在 Firebase 上使用 Game Center 登录服务,请首先确保本地玩家已登录 Game Center,然后使用 GameCenterAuthProvider 对象生成一个 Firebase 凭据,您可以使用该凭据进行 Firebase 身份验证。

准备工作

使用 Swift Package Manager 安装和管理 Firebase 依赖项。

  1. 在 Xcode 中打开您的应用项目,依次点击 File(文件)> Add Packages(添加软件包)
  2. 出现提示时,添加 Firebase Apple 平台 SDK 代码库:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. 选择 Firebase Authentication 库。
  5. -ObjC 标志添加到目标 build 设置的“其他链接器标志”部分。
  6. 完成之后,Xcode 将会自动开始在后台解析和下载您的依赖项。

接下来,执行一些配置步骤:

  1. 确保在 Firebase 中注册您的 Apple 应用,即在注册部分输入您应用的软件包 ID 以及其他可选信息,例如 App Store ID 和团队 ID 等。系统需要这些信息来安全验证用户 Game Center 凭据的目标设备,以便完成登录。
  2. 启用 Game Center 作为您的 Firebase 项目的登录服务提供方:
    1. Firebase 控制台中,打开 Authentication 部分。
    2. 登录方法标签页中,启用 Game Center 登录服务提供方。

将 Game Center 登录服务集成到您的游戏中

首先,如果您的游戏尚未使用 Game Center,请按照 Apple 开发者网站上将 Game Center 整合至您的游戏中以及在设备上对本地玩家进行身份验证中的说明操作。

确保您提供给 iTunes Connect 的软件包 ID 与您将应用关联到 Firebase 项目时使用的软件包 ID 一致。

在集成 Game Center 的过程中,您要定义一个身份验证处理程序,Game Center 身份验证过程中有多处会调用该处理程序。在此处理程序中,请检查玩家是否已登录 Game Center。如果玩家已登录,则可继续登录 Firebase。

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

进行 Firebase 身份验证

确定本地玩家已登录 Game Center 后,使用 GameCenterAuthProvider.getCredential() 创建一个 AuthCredential 对象并将其传递给 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.
    }];
  }
}];

后续步骤

用户首次登录后,系统会创建一个新的用户账号,并将该账号与其 Game Center ID 关联。这个新账号归属于您的 Firebase 项目,可用于在该项目中的每个应用中标识用户。

在您的游戏中,您可以从 User 对象获取用户的 Firebase UID:

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

在您的 Firebase Realtime Database 和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后利用此 ID 来控制用户可以访问哪些数据。

如需获取用户的 Game Center 玩家信息或访问 Game Center 服务,请使用 Game Kit 提供的 API。

要使用户退出 Firebase 账号,请调用 Auth.signOut()

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