使用 Game Center 进行身份验证

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

准备工作

  1. 将 Firebase 添加到您的 iOS 项目

    请务必在您的 Podfile 中添加以下 Pod:

    pod 'Firebase/Auth'
    
  2. 如果您尚未将您的应用与 Firebase 项目相关联,请在 Firebase 控制台中进行关联。

  3. 启用 Game Center 作为您的 Firebase 项目的登录服务提供方:
    1. Firebase 控制台中,打开身份验证部分。
    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 实时数据库和 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;
}

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面