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

问题描述

我的问题听起来很简单:我有一个App和一个Share Extension。我想做的是检查共享扩展名内部是否有用户登录。为此,我找到了这个documentation

现在,如果用户登录,我会将登录用户迁移到共享钥匙串(在主应用程序内部):

   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检索数据。但这失败了,因为currentUsernil ...

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-AUT000001]启动时加载已保存的用户时出错:Error Domain = FIRAuthErrorDomain代码= 17995“访问钥匙串时发生错误。@c中的@c NSLocalizedFailurereasonerrorKey字段NSError.userInfo词典将包含有关遇到的错误的更多信息。“ UserInfo = {FIRAuthErrorUserInfoNameKey = ERROR_KEYCHAIN_ERROR,NSLocalizedFailureReason = SecItemcopyMatching(0),NSLocalizedDescription =访问钥匙串时发生错误。 @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 替换为我放置 XXXXXXXXXXXXX 占位符的位置。