ios - 从 Flutter 应用程序访问 ExpoSecureStore 存储的钥匙串(keychain)值 [iOS]

标签 ios objective-c flutter react-native-ios keychain

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

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

所以,这就是我所做的:

  • 我从 App Store 安装了 RN 应用程序,
  • 登录( token 保存在 ExpoSecureStore),
  • 安装我的 Flutter 应用程序
  • 尝试访问钥匙串(keychain) - 没有找到!
  • 从 App Store 重新安装 RN 应用程序,
  • 当我打开应用程序时,用户已登录!

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

    2020 年 3 月 18 日更新。

    这是 ReactNative 的 AppstoreConnect 上的最新版本如下所示:
    React Native entitlements on AppstoreConnect

    这是我们的 的相同信息 flutter build :
    Flutter entitlements on AppstoreConnect

    我尝试将 Flutter 的 XCode 项目中的钥匙串(keychain)组设置为各种值:TEAM_ID.* , TEAM_ID. , TEAM_ID , * , TEAM_ID.com.my_real_app_id等等..但没有任何帮助
    Entitlements of Flutter app XCode project

    有什么我想念的吗?

    ==============原始问题继续================

    我正在使用 FlutterSecureStoragePlugin ( link to the .m file ) 访问钥匙串(keychain)值。

    这是 EXSecureStore.m 的链接文件 - EXSecureStore.m on GitHub .
  • Flutter 应用程序具有相同的包 ID,所以这不应该是问题。
  • 我更改了它的源代码,以便使用相同的钥匙串(keychain)服务(kSecAttrService),默认为 "app" .
  • 另外,我已经复制并修改了用于从 ExpoSecureStore.m 读取钥匙串(keychain)值的代码。至FlutterSecureStoragePlugin.m但仍然没有运气..

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

    感谢您的阅读!

    最佳答案

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

    TL;博士

    最重要的是你设置了相同的keychain access group , 相同 kSecAttrService (钥匙串(keychain)服务),当然还有您要访问的项目的 key 。

    以下是先决条件:

  • 您必须设置 keychain access group与 react native 的构建中的值相同,即 TEAM_ID.* .这可以通过以下两个选项之一来实现:
  • 将钥匙串(keychain)共享功能设置为 * ,如下图所示,
  • 打开权利文件 ( project_dir/ios/Runner/Runner.entitlements ) 并添加项目 $(AppIdentifierPrefix)* 项目 TEAM_ID.*keychain access groups大批。请注意,如果您要添加第一项,则没有 .* 之前, 自 AppIdentifierPrefix转换为 TEAM_ID.在构建之前。 Link to the apple docs on the keychain-access-groups entitlement .
    xCode keychain access group setup for react native / expo and flutter
  • 如果您正在开发的应用程序有 相同的捆绑包 ID (即它是对现有 ReactNatvie/Expo 应用程序的更新),您在访问钥匙串(keychain)项目时应该没有任何问题(当然,当您完成所有其他先决条件时)。 另外,如果应用有相同的钥匙串(keychain)共享组 , 在这种情况下 TEAM_ID.* ,它还应该能够访问钥匙串(keychain)项目。请注意,将钥匙串(keychain)访问组设置为 TEAM_ID.* 意味着只有同一开发人员(团队)开发的应用程序才能访问 RN 应用程序的钥匙串(keychain)项。
  • 您必须更改 Flutter 的库(或原生 iOS)源代码,使其 使用与 Expo 相同的钥匙串(keychain)服务 ( kSecAttrService ) .对于世博会,如果您没有通过 keychainService SecureStore 选项中的参数,kSecAttrService您要写入(或获取)的项目的属性将为 app .您可以自己查看 here, on the expo native library's source code on GitHub (link) .我创建了一个 flutter 库的分支,我会在 future 的某个时候提出拉取请求,但你可以将插件的默认钥匙串(keychain)服务更改为 app 也是。当前默认为 flutter_secure_storage_service ,见 the plugin's source code on GitHub (link) .
  • 最棘手的部分 - 因为我在上述所有步骤中都怀疑 - 是 为钥匙串(keychain)项 设置正确的 key ( kSecAttrAccount )我想得到。帮助我的是使用 Flutter 插件的 readAll方法(link to the native source code of readAll on GitHub)。它向我展示了钥匙串(keychain)项目确实在那里,但 key 与 ReactNative 应用程序使用的不同。正如我通过调试发现的那样(文档中没有!!!), expo 用户名和 expo 项目名称添加在 ** 之前用于键的字符串**!因此,如果在 ReactNative 应用程序中您使用 key accessToken 保存 token ,它将作为 保存到钥匙串(keychain)中@expousername/project-name-accessToken !它不在文档中,我不知道它是如何发生的,因为我查看了源代码

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

    关于ios - 从 Flutter 应用程序访问 ExpoSecureStore 存储的钥匙串(keychain)值 [iOS],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60703577/

    相关文章:

    javascript - 我们如何在钛 GridView 项目中实现 Onclick 功能

    iphone - 更改 UIView 动画转换背后的背景

    flutter - overflow hidden flutter,没有溢出的消息

    flutter - 如何获得Dart运行时的代码覆盖率?

    ios - Swift 中是否有 PrettyTime 函数

    UIPageViewController 的 Ios 下拉刷新策略

    ios - 从 UITableView 中删除行时以 NSException 类型的未捕获异常终止

    ios - 有什么方法可以将参数的 NSDictionary 附加到 NSURLRequest 而不是手动制作字符串?

    objective-c - 使用 NSUserDefaults 错误保存隐藏按钮状态

    flutter - 监听 ws ://127. 0.0.1:58848/BJZ_ZgFILrE=/ws 的调试服务