使用共享的iOS钥匙链启用跨应用Firebase身份验证



我的问题听起来很简单:我有一个应用程序和一个共享扩展。我想做的是在共享扩展中检查用户是否登录。为此,我找到了这份文档。

现在,如果用户登录,我会将登录的用户迁移到共享密钥链(在主应用程序中(:

Auth.auth().createUser(withEmail: email, password: password) { (result, error) in

if let userId = result?.user.uid { // successfully signed in

let user = Auth.auth().currentUser
do {
try Auth.auth().useUserAccessGroup("teamID.com.example-app.group")
} catch let error as NSError {
print("Error changing user access group: %@", error)
}
Auth.auth().updateCurrentUser(user!) { error in
print(error?.localizedDescription as Any)
}
}
}

这没有给我任何错误,所以我想它是有效的。但我现在面临两个主要问题:

1.主应用程序内部的问题:

正如我所说的,上面的代码运行良好,我也加载了一些数据,这些数据在用户第一次注册时运行良好。但是,如果我重新启动应用程序,用户就不必再次登录,并且应该被引导到主视图,在那里我可以再次检索currentUser的数据。但这是失败的,因为currentUser就是nil。。。

static func getWishlists(completion: @escaping (_ success: Bool, _ dataArray: Any?, _ dropDownArray: Any?) -> Void) {

let db = Firestore.firestore()
let userID = Auth.auth().currentUser!.uid // <- throws error
...

该函数也会在用户登录后立即调用(顶部的第一个代码片段(,并且工作正常,但只是第一次。

这是我从Firebase得到的error

6.21.0-[Firebase/Auth][I-AUT0000001]启动时加载保存的用户时出错:错误域=FIRAuthErrorDomain代码=17995";访问钥匙链时出错。@c NSError.userInfo字典中的@c NSLocalizedFailureReasonErrorKey字段将包含有关遇到的错误的更多信息";UserInfo={FIRAuthErrorUserInfoNameKey=ERROR_KEYCHAIN_ERROR,NSLocalizedFailureReason=SecItemCopyMatching(0(,NSLocaledDescription=访问密钥链时出错。@c NSError.UserInfo字典中的@c NSLocalizedFailureReasonErrorKey字段将包含有关遇到的错误的详细信息}

我的Share Extension中的第二个问题:

就像我说的,我想检查用户是否登录。为此,我在Share Extension:中尝试了这个

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

if Auth.auth().currentUser != nil {
// User is signed in.
print("signed in")
} else {
// No user is signed in.
print("not signed in")
}

但这是打印not signed in,即使用户刚刚在主应用程序内登录。

我不知道我到底做错了什么,在文件中也找不到任何东西。也许这就是我为用户检索数据的方式。也许我也需要用accessGroup打电话,但我被卡住了。。。感谢您的帮助!

我不太确定你的问题,但你不是应该更改一组你自己的userAccessToken 吗

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

if Auth.auth().currentUser != nil {
// User is signed in.
print("signed in")
} else {
// No user is signed in.
print("not signed in")
}

将您的应用userAccessGroup替换为我放置XXXXXXXXXXXX占位符的位置。

最新更新