如需在 Apple 平台上跨多个应用或扩展程序共享身份验证状态,请使用密钥链服务将身份验证状态存储在共享密钥链中,并将这些应用配置为使用该共享密钥链。
这可实现以下目的:
- 用户执行一次登录操作,即可登录同一访问群组中的所有应用。
- 用户执行一次退出登录操作,即可退出登录属于同一访问群组的所有应用。
在应用之间共享身份验证状态
如需在应用之间共享身份验证状态,请执行以下操作:
为您的应用设置访问群组。
您可以使用密钥链访问群组或应用群组。如需了解详情,请参阅在一系列应用中共享对密钥链项的访问权限。
如需设置密钥链访问群组,请为每个应用执行以下操作:
- 在 Xcode 中,转到 Project settings > Capabilities。
- 启用密钥链共享。
- 添加密钥链群组标识符。为需要共享状态的所有应用使用同一标识符。
在每个应用中,将访问群组设置为您在上一步中创建的密钥链访问群组或应用群组。
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];
在至少一个应用中,使用任意登录方法让用户登录。
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;
切换回未共享的密钥链
将访问群组设置为
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];
使用任意登录方法让用户登录。任何其他应用将无法获知用户状态。
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;
(可选)检查要共享的访问群组的身份验证状态。
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 }
使用您之前在项目设置中设置的访问群组。
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];
更新当前用户。
Swift
Auth.auth().updateCurrentUser(user!) { error in // Error handling }
Objective-C
[FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) { // Error handling }];
现在,有权访问同一访问群组的其他应用可以访问该用户了。