用户未在 Share App Extension 中登录 Firebase

Posted

技术标签:

【中文标题】用户未在 Share App Extension 中登录 Firebase【英文标题】:User not signed into Firebase in Share App Extension 【发布时间】:2017-09-27 07:51:24 【问题描述】:

我在我的应用共享扩展中进行了一些 API Firebase 调用(下载一些用户特定的数据),但用户没有登录 Firebase(又名 currentUser 为零)所以我没有得到任何数据,因为我需要uid。换句话说,数据库只允许经过身份验证的用户访问数据。我该如何解决这个问题?

【问题讨论】:

你能解决这个问题吗?我目前的解决方法是,当用户登录包含的应用程序时,currentUser.uid 被保存到可以在扩展中查询的共享容器 (UserDefaults.init?(suiteName...)) 中。我仍在研究如何在初始登录丢失时触发身份验证。 @toraritte 个人还没有找到解决方案,但您走在正确的轨道上。请检查下面有人发布的新答案。如果你找到了让它工作的方法,请回答这个问题。 我问过more generic question 处理同样的问题。如果我可以让它工作,我一定会发布它。 【参考方案1】:

要扩展 KutakMir's answer,这些步骤对我们有用:

第 1 步:为共享扩展设置 Firebase

来自*** answer的步骤:

    将包含应用的 GoogleService-Info.plist 复制到您的 Xcode 中的扩展 将复制的 GoogleService-Info.plist 拖入 Xcode 到你的分享扩展和 将 BUNDLE_ID 更改为您的共享扩展目标的名称 向 Podfile 添加新目标 安装依赖项 (pod install) 配置 Firebase 扩展程序中的应用程序对象

步骤 2. 在包含(即主)应用程序和共享扩展程序之间设置共享容器

在App Extension Programming Guide: Handling Common Scenarios 中描述。基本上在 Capabilities 选项卡上为您的两个目标(即包含应用程序和共享扩展程序)打开“App Groups”,并在两个位置提供相同的名称。 p>

第 3 步。设置钥匙串共享

基本步骤与步骤 2 类似:在 Capabilities 选项卡上为两个目标打开“钥匙串共享”,并在两个位置提供指定。 (在the official docs中更详细。)

确保在使用文档中的查询时将您的 APP_ID 附加到 Keychain 访问组!上面的链接指出了这一点,但是 this Github issue comment is more useful.

步骤 4. 使用 Keychain 和共享容器同步用户访问

我们的工作流程:

登录时(在共享扩展程序或主应用程序中),将用户 ID 保存到共享容器,并使用用户 ID 作为密钥将用户名和密码保存到 Keychain

在启动时(共享扩展或主应用程序),检查共享容器的用户 ID。如果存在,则意味着用户已经登录了主应用程序或共享扩展,因此他们应该同时登录。因此,从 Keychain 中检索凭据,并使用 signIn(withEmail:password:completion:)

登录用户

Our project at the point when everything was set up。它有很多重复,但很有效。相关文件是

访问 News/LoginViewController.swift 访问 News/SessionStartViewController.swift 访问新闻/NVC.swift Access-News-Uploader/UploaderNavigationViewController.swift

追踪钥匙串错误代码

这是最令人沮丧的部分。错误代码的类型为OSStatus,它们在Security Framework Result Codes 中列出,但有时在测试时只看到一个有符号整数。我找不到官方名单,但OSStatus.com 会省去很多挫败感。例如,这里是query of all the Security Framework codes。


官方 Keychain 文档的其他有用链接:

Adding a Password to the Keychain Searching for Keychain Items Updating and Deleting Keychain Items kSecValueData(这不是我预期的) Item Return Result Keys Item Class Keys and Values Item Attribute Keys and Values

【讨论】:

如果用户在没有用户名/密码的情况下通过 Facebook 登录,您将如何处理? 我猜它会沿着同样的路线?抱歉,没有使用 Facebook 登录,我的大部分结果来自漫长而痛苦的实验......【参考方案2】:

转到您的主要目标和扩展目标并设置钥匙串共享。 Firebase 身份验证正在将访问令牌保存到钥匙串。

【讨论】:

【参考方案3】:

现有的答案并没有为我解决这个问题,但我确实找到了这个official FireBase documentation。

总之,修复是在应用程序和扩展程序中使用具有相同标识符的应用程序组功能。

然后包括代码:

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

在我的测试中,经过身份验证的用户在主应用和共享扩展中具有相同的uid

HTH

【讨论】:

我得到了与当前答案相同的解决方案。事实上,它还可以通过将相关令牌存储在钥匙串中来与 facebook 和 google 登录一起使用。但是,它不适用于 Sign in with Apple,因为它使用随机数。所以使用应用组或钥匙串共享是正确的解决方案。 嗨,Darius,我真的很难在共享扩展中验证我的用户。你在哪里调用上面的这段代码?你能看看我最近的问题吗?我被错误困住了...... @cybergen 它还在为你工作吗?我正在尝试,但我只是收到钥匙串错误...你能看看我的最新问题吗? 这是个问题:***.com/questions/64705258/… @Chris 我正在使用SLComposeServiceViewController,我在didSelectPost 回调中使用此代码。确保您在 XCode 中的共享扩展和应用程序的签名和功能中设置了应用程序组

以上是关于用户未在 Share App Extension 中登录 Firebase的主要内容,如果未能解决你的问题,请参考以下文章

iOS9 Share Extension 无法在 Xcode 上调试

iOS扩展Extension之Today

/usr/pgsql-9.3/share/extension 中不存在 Postgres plpythonu 扩展

来自 Share Extension 的 Safari 截图

错误:无法打开扩展控制文件“/usr/pgsql-9.6/share/extension/postgis.control”:没有这样的文件或目录

iOS扩展开发攻略Share Extension