从 Flutter 应用程序访问 ExpoSecureStore 存储的钥匙串值 [iOS]

Ale*_*dar 4 objective-c keychain ios flutter react-native-ios

我有一个 ReactNative 应用程序(仅针对 iOS 发布),它使用ExpoSecureStore来放置和读取 iOS 钥匙串中的值。

我正在过渡到 Flutter,我需要保持用户登录状态,即从之前安装的 RN 版本的应用程序中获取他们的身份验证令牌。

所以,这就是我所做的:

  1. 我从 App store 安装了 RN 应用程序,
  2. 登录(令牌用ExpoSecureStore保存),
  3. 安装我的 Flutter 应用程序
  4. 尝试访问钥匙串 - 未找到任何内容!
  5. 从 App store 重新安装 RN 应用程序,
  6. 当我打开应用程序时,用户已登录!

因此,我的 Flutter 安装不会删除令牌,但无法访问它们。

2020 年 3 月 18 日更新。

以下是ReactNative在 AppstoreConnect 上的最新版本: AppstoreConnect 上的 React Native 权利

以下是我们的Flutter构建的相同信息: AppstoreConnect 上的 Flutter 权利

我尝试将 Flutter 的 XCode 项目中的钥匙串组设置为各种值:TEAM_ID.*TEAM_ID.TEAM_ID*TEAM_ID.com.my_real_app_id。但没有任何帮助 Flutter应用XCode项目的权利

我有什么遗漏的吗?

==============原来的问题继续================

我正在使用FlutterSecureStoragePlugin链接到.m文件)来访问钥匙串值。

以下是GitHub 上的EXSecureStore.m文件EXSecureStore.m的链接。

  • Flutter 应用程序具有相同的包 ID,因此这应该不是问题。

  • 我更改了其源代码,以便使用相同的钥匙串服务 ( kSecAttrService),默认为"app".

  • ExpoSecureStore.m另外,我已经复制并调整了用于读取钥匙串值的代码,FlutterSecureStoragePlugin.m但仍然没有运气。

RN 和 Flutter 库将字符串传递给原生 iOS 的方式有什么不同吗?我想钥匙串访问肯定发生了一些我不知道的事情,所以非常欢迎任何帮助!

感谢您的阅读!

Ale*_*dar 5

我终于解决了世博安全商店访问问题!

长话短说

最重要的是您设置相同的keychain access groupkSecAttrService钥匙串服务),当然还有您想要访问的项目的密钥。

这是前提条件:

  • 您必须将 的值设置keychain access group为与 React Native 的构建中相同的值,即TEAM_ID.*. 这可以通过以下两个选项之一来实现:

    • 将钥匙串共享功能设置为*,如下面的屏幕截图所示,或者
    • 打开权利文件 ( project_dir/ios/Runner/Runner.entitlements) 并将项目$(AppIdentifierPrefix)* 项目添加TEAM_ID.*keychain access groups数组中。.请注意,如果您要添加第一项,则 , 之前没有*,因为在构建之前AppIdentifierPrefix被转换为。有关权利的Apple 文档的链接。 TEAM_ID.keychain-access-groups用于 React Native / Expo 和 Flutter 的 xCode 钥匙串访问组设置
  • 如果您正在开发的应用程序具有相同的捆绑包 ID(即,它是现有 ReactNatvie/Expo 应用程序的更新),那么您在访问钥匙串项时不应该有任何问题(当然,当您满足所有其他先决条件时)。此外,如果应用程序具有相同的钥匙串共享组,在这种情况下TEAM_ID.*,它也应该能够访问钥匙串项目。请注意,将钥匙串访问组设置为 TEAM_ID.* 意味着只有同一开发人员(团队)开发的应用程序才能访问 RN 应用程序的钥匙串项。

  • 您必须更改 Flutter 的库(或本机 iOS)源代码,以便它使用与 Expo相同的钥匙串服务(kSecAttrService ) 。对于 Expo,如果您没有keychainService在 SecureStore 选项中传递参数,则kSecAttrService您要写入(或获取)的项目的属性将为app您可以在 GitHub 上的 expo 本机库源代码(链接)上看到这一点。我制作了 flutter 库的一个分支,并且我将在将来的某个时候发出拉取请求,但是您也可以将插件的默认钥匙串服务更改为app。目前默认为,如GitHub 上的插件源代码(链接)flutter_secure_storage_service所示。

  • 最棘手的部分 - 因为我在上述所有步骤中都怀疑 - 是为我想要获得的钥匙串项目设置正确的密钥 ( )。kSecAttrAccount对我有帮助的是使用 Flutter 插件的readAll方法(链接到GitHub 上的原生源代码readAll)。它向我展示了钥匙串项目实际上在那里,但钥匙与 ReactNative 应用程序使用的钥匙不同。正如我通过调试发现的那样(文档中没有它!!!),expo 用户名和 expo 项目名称被添加在**用于密钥的字符串**之前!因此,如果在 ReactNative 应用程序中您使用 key 保存令牌accessToken,它将被保存到钥匙串中@expousername/project-name-accessToken!文档中没有它,我不知道它是如何发生的,因为我已经查看了源代码

在我的问题中,我说我已经将 Objective-C 代码从 expo 的库复制到 Flutter 的插件中,但这不是必需的。