我有一个ReactNative应用程序(仅针对iOS发布),该应用程序使用ExpoSecureStore从iOS钥匙串中读取值。
我正在过渡到Flutter,我需要来保持用户登录状态,即从以前安装的该应用的RN版本中获取身份验证 token 。
所以,这是我的工作:
因此,我的Flutter安装未删除 token ,但无法访问 token 。
更新18.3.2020。
这是 ReactNative的最新构建在AppstoreConnect上的样子:
这是我们的 Flutter 构建的相同信息:
我尝试将Flutter的XCode项目中的钥匙串组设置为各种值:
TEAM_ID.*
,TEAM_ID.
,TEAM_ID
,*
,TEAM_ID.com.my_real_app_id
等。但是没有任何帮助我有什么想念的吗?
==============原始问题继续================
我正在使用
FlutterSecureStoragePlugin
(link to the .m
file)访问钥匙串值。这是
EXSecureStore.m
文件EXSecureStore.m on GitHub的链接。kSecAttrService
),默认为"app"
。 ExpoSecureStore.m
到FlutterSecureStoragePlugin.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。TEAM_ID.*
,它还应该能够访问钥匙串项。请注意,将钥匙串访问组设置为TEAM_ID。*意味着只有同一开发人员(团队)开发的应用程序才能访问RN应用程序的钥匙串项目。 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的插件,但这不是必需的。