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

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

所以,这是我的工作:

  • 我从App Store安装RN应用
  • 登录( token 通过ExpoSecureStore保存),
  • 安装我的Flutter应用程序
  • 尝试访问钥匙串-找不到任何内容!
  • 从App Store
  • 重新安装RN应用
  • 打开应用程序时,用户已登录!

  • 因此,我的Flutter安装未删除 token ,但无法访问 token 。

    更新18.3.2020。

    这是 ReactNative的最新构建在AppstoreConnect上的样子:
    ios - 从Flutter应用[iOS]访问ExpoSecureStore存储的钥匙串(keychain)值-LMLPHP

    这是我们的 Flutter 构建的相同信息:
    ios - 从Flutter应用[iOS]访问ExpoSecureStore存储的钥匙串(keychain)值-LMLPHP

    我尝试将Flutter的XCode项目中的钥匙串组设置为各种值:TEAM_ID.*TEAM_ID.TEAM_ID*TEAM_ID.com.my_real_app_id等。但是没有任何帮助
    ios - 从Flutter应用[iOS]访问ExpoSecureStore存储的钥匙串(keychain)值-LMLPHP

    我有什么想念的吗?

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

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

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

  • RN和Flutter库将字符串向下传递到本机iOS的方式是否有任何区别?我想钥匙串访问肯定有一些未知的事情,因此非常欢迎您提供任何帮助!

    感谢您的阅读!

    最佳答案

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

    TL; DR

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

    前提条件如下:

  • ,您必须将keychain access group设置为与react native的构建中相同的值,即 TEAM_ID.* 。这可以通过以下两种方法之一来实现:
  • 将“钥匙串共享”功能设置为 * ,如下面的屏幕截图所示
  • 打开权利文件(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
    ios - 从Flutter应用[iOS]访问ExpoSecureStore存储的钥匙串(keychain)值-LMLPHP
  • 如果您正在开发的应用程序具有相同的包ID (即,它是对现有ReactNatvie / Expo应用程序的更新),则访问钥匙串项目应该没有任何问题(当然,当您执行所有其他前提条件时) )。 同样,如果应用程序具有相同的钥匙串共享组,在这种情况下为TEAM_ID.*,它还应该能够访问钥匙串项。请注意,将钥匙串访问组设置为TEAM_ID。*意味着只有同一开发人员(团队)开发的应用程序才能访问RN应用程序的钥匙串项目。
  • ,您必须更改Flutter的库(或本机iOS)源代码,以便使用与Expo 相同的钥匙串服务(kSecAttrService)。对于Expo,如果您没有在SecureStore选项中传递keychainService参数,则您要编写(或获取)的项目的kSecAttrService属性将为 app 。您可以看到自己here, on the expo native library's source code on GitHub (link)。我做了一个flutter库的分支,将来会提出一个拉取请求,但是您也可以将插件的默认钥匙串服务也更改为 app 。如the plugin's source code on GitHub (link)所示,它当前默认为flutter_secure_storage_service
  • 最棘手的部分-由于我在上述所有步骤中都对此表示怀疑-是为我想获取的钥匙串项目设置正确的密钥(kSecAttrAccount)。帮助我的是使用Flutter插件的readAll方法(link to the native source code of readAll on GitHub)。它向我显示了钥匙串项目实际上在那儿,但是钥匙与ReactNative应用程序所使用的钥匙不同。正如我通过调试发现的那样(在文档中没有任何地方!!!),会在****** _ rstrong用于密钥的字符串**之前添加expo用户名和expo项目的名称!因此,如果在ReactNative应用程序中使用accessToken密钥保存 token ,则 token 将作为保存到钥匙串@expousername/project-name-accessToken !它在文档中无处可寻,我也不知道它是如何发生的,因为我已经浏览了源代码

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

    10-01 21:23