[英]Access Keychain values stored by ExpoSecureStore from a Flutter app [iOS]
我有一個 ReactNative 應用程序(僅針對 iOS 發布),它使用ExpoSecureStore來放置和讀取來自 iOS 鑰匙串的值。
我正在過渡到 Flutter,我需要讓用戶保持登錄狀態,即從之前安裝的 RN 版本的應用程序中獲取他們的身份驗證令牌。
所以,這就是我要做的:
因此,我的 Flutter 安裝不會刪除令牌,但無法訪問它們。
這是ReactNative在 AppstoreConnect 上的最新版本:
我嘗試將 Flutter 的 XCode 項目中的鑰匙串組設置為各種值: TEAM_ID.*
、 TEAM_ID.
, TEAM_ID
, *
, TEAM_ID.com.my_real_app_id
等..但沒有任何幫助
==============原始問題繼續==============
我正在使用FlutterSecureStoragePlugin
( 鏈接到.m
文件)來訪問 Keychain 值。
這是GitHub 上EXSecureStore.m
文件的鏈接 - EXSecureStore.m 。
Flutter 應用程序具有相同的包 ID,所以這應該不是問題。
我更改了它的源代碼,以便我使用相同的鑰匙串服務 ( kSecAttrService
),默認為"app"
。
此外,我已經將用於讀取鑰匙ExpoSecureStore.m
的代碼從ExpoSecureStore.m
復制並改編為FlutterSecureStoragePlugin.m
但仍然沒有運氣..
RN 和 Flutter 庫將字符串傳遞給原生 iOS 的方式有什么不同嗎? 我想一定有一些我不知道的鑰匙串訪問發生了什么,所以非常歡迎任何幫助!
感謝您的閱讀!
我終於解決了expo安全商店訪問問題!
最重要的是,您設置了相同的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.
在構建之前。 鏈接到關於keychain-access-groups
entitlement 的蘋果文檔。 如果您正在開發的應用程序具有相同的包 ID (即它是對現有 ReactNatvie/Expo 應用程序的更新),則訪問鑰匙串項目應該不會有任何問題(當然,當您執行所有其他前提條件時)。 此外,如果應用程序具有相同的鑰匙串共享組,在本例中為TEAM_ID.*
,它也應該能夠訪問鑰匙串項目。 請注意,將鑰匙串訪問組設置為 TEAM_ID.* 意味着只有由同一開發人員(團隊)開發的應用程序才能訪問 RN 應用程序的鑰匙串項目。
您必須更改 Flutter 的庫(或本機 iOS)源代碼,以便它使用與 Expo 相同的鑰匙串服務( kSecAttrService
) 。 對於 Expo,如果您沒有在 SecureStore 選項中傳遞keychainService
參數,則您要寫入(或獲取)的項目的kSecAttrService
屬性將為app
。 你可以看到自己在這里,在GitHub上(鏈接)博覽會本地庫的源代碼。 我創建了 flutter 庫的 fork,將來某個時候我會發出一個 pull request,但是你也可以將插件的默認鑰匙串服務更改為app
。 它目前默認為flutter_secure_storage_service
,如GitHub (link) 上插件的源代碼所示。
最棘手的部分 - 因為我在上述所有步驟中都懷疑 - 是為我想要獲得的鑰匙串項目設置正確的密鑰( kSecAttrAccount
) 。 幫助我的是使用 Flutter 插件的readAll
方法( 鏈接到 GitHub 上readAll
的本機源代碼)。 它向我展示了鑰匙串項目實際上在那里,但鑰匙與 ReactNative 應用程序使用的鑰匙不同。 正如我通過調試發現的(文檔中沒有!!!),在用於密鑰的字符串**之前添加了博覽會用戶名和博覽會項目名稱**! 因此,如果在 ReactNative 應用程序中您使用密鑰accessToken
保存令牌,它將作為@expousername/project-name-accessToken
保存到鑰匙串中! 它在文檔中無處可尋,我不知道它是如何發生的,因為我已經查看了源代碼
在我的問題中,我說我已經將 expo 庫中的 Objective-C 代碼復制到 Flutter 的插件中,但這不是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.