使用共享 Keychain 启用跨应用身份验证

如需在 Apple 平台上跨多个应用或扩展程序共享身份验证状态,请使用密钥链服务将身份验证状态存储在共享密钥链中,并将这些应用配置为使用该共享密钥链。

这可实现以下目的:

  • 用户执行一次登录操作,即可登录同一访问群组中的所有应用。
  • 用户执行一次退出登录操作,即可退出登录属于同一访问群组的所有应用。

在应用之间共享身份验证状态

如需在应用之间共享身份验证状态,请执行以下操作:

  1. 为您的应用设置访问群组。

您可以使用密钥链访问群组或应用群组。如需了解详情,请参阅在一系列应用中共享对密钥链项的访问权限。

如需设置密钥链访问群组,请为每个应用执行以下操作:

  1. 在 Xcode 中,前往项目设置 > 功能。
  2. 启用密钥链共享。
  3. 添加密钥链群组标识符。为需要共享状态的所有应用使用同一标识符。
  4. 在每个应用中,将访问群组设置为您在上一步中创建的密钥链访问群组或应用群组。

### Swift

do { try Auth.auth().useUserAccessGroup("TEAMID.com.example.group1") } catch let error as NSError { print("Error changing user access group: %@", error) }

### Objective-C

[FIRAuth.auth useUserAccessGroup:@"TEAMID.com.example.group1" error:nil]; 3. 在至少一个应用中,使用任意登录方法让用户登录。

### Swift

Auth.auth().signInAnonymously { result, error in // User signed in }

### Objective-C

[FIRAuth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { // User signed in }];

同一当前用户可在该访问群组的所有应用中调用。

### Swift

var user = Auth.auth().currentUser

### Objective-C

FIRUser *user = FIRAuth.auth.currentUser;

切换回未共享的密钥链

  1. 将访问群组设置为 nil,以停止共享身份验证状态。

### Swift

do { try Auth.auth().useUserAccessGroup(nil) } catch let error as NSError { print("Error changing user access group: %@", error) }

### Objective-C

[FIRAuth.auth useUserAccessGroup:nil error:nil]; 2. 使用任意登录方法让用户登录。任何其他应用将无法获知用户状态。

### Swift

Auth.auth().signInAnonymously { result, error in // User signed in }

### Objective-C

[FIRAuth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { // User signed in }];

将已登录的用户迁移到共享密钥链

如需将已登录的用户迁移到共享状态,请执行以下操作:

  1. 生成对当前用户的引用以供将来使用。

### Swift

var user = Auth.auth().currentUser

### Objective-C

FIRUser *user = FIRAuth.auth.currentUser; 2. (可选)检查要共享的访问群组的身份验证状态。

### Swift

let accessGroup = "TEAMID.com.example.group1" var tempUser: User? do { try tempUser = Auth.auth().getStoredUser(forAccessGroup: accessGroup) } catch let error as NSError { print("Error getting stored user: %@", error) } if tempUser != nil { // A user exists in the access group } else { // No user exists in the access group }

### Objective-C

NSString *accessGroup = @"TEAMID.com.example.group1"; FIRUser *tempUser = [FIRAuth getStoredUserForAccessGroup:accessGroup error:nil]; if (tempUser) { // A user exists in the access group } else { // No user exists in the access group } 3. 使用您之前在项目设置中设置的访问群组。

### Swift

do { try Auth.auth().useUserAccessGroup(accessGroup) } catch let error as NSError { print("Error changing user access group: %@", error) }

### Objective-C

[FIRAuth.auth useUserAccessGroup:accessGroup error:nil]; 4. 更新当前用户。

### Swift

Auth.auth().updateCurrentUser(user!) { error in // Error handling }

### Objective-C

[FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) { // Error handling }]; 5. 现在,有权访问同一访问群组的其他应用可以访问该用户了。