You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native存储JWT Token遇react-native-keychain报错求助

解决react-native-keychain调用报错的问题

问题说明

首次开发基于ExpressJS+MongoDB的React Native JWT认证应用,因AsyncStorage安全性问题选用react-native-keychain存储Token,但调用setGenericPassword和getGenericPassword时出现错误:
Cannot read property 'getGenericPasswordForOptions', 'setGenericPasswordForOptions' of null

相关代码片段:

const response = await axios.post(`${config.END_POINT}/users`, formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        })

await Keychain.setGenericPassword('token', response.token)

/* App.js */

useEffect(() => {
        async function getToken() {
            try {
                const token = await Keychain.getGenericPassword()
                dispatch({
                    type: 'auth/setToken',
                    payload: token
                })
            }
            catch (error) {
                console.error(error.message)
            }
        }
        getToken()
    }, [dispatch])

修复步骤

1. 确认依赖安装与链接

  • 重新安装依赖:
    npm install react-native-keychain --save
    # 或yarn
    yarn add react-native-keychain
    
  • React Native 0.60+支持自动链接,旧版本需手动执行:
    react-native link react-native-keychain
    
  • 安装完成后重启Metro Bundler,并重新构建项目(iOS执行cd ios && pod install,Android重新编译)。

2. 平台配置检查

iOS

  • 进入ios目录执行pod install,确保Pod依赖正确引入
  • 在Info.plist中添加钥匙串权限(如需Face ID支持):
    <key>NSFaceIDUsageDescription</key>
    <string>需要访问钥匙串存储认证信息</string>
    

Android

  • 在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.USE_BIOMETRIC" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    
  • 确保项目minSdkVersion不低于16(react-native-keychain最低要求)

3. 版本兼容性调整

若使用较新React Native版本,尝试升级react-native-keychain到最新稳定版:

npm update react-native-keychain

4. 代码逻辑修正

  • getGenericPassword返回包含username和password的对象,需提取对应字段:
    const credentials = await Keychain.getGenericPassword()
    if (credentials) {
      dispatch({
        type: 'auth/setToken',
        payload: credentials.password // 对应存储时的response.token
      })
    }
    
  • 增加Token存在性校验,避免传入无效值:
    if (response?.token) {
      await Keychain.setGenericPassword('token', response.token)
    } else {
      console.error('认证接口未返回有效Token')
    }
    

5. 清理缓存重建

  • 清除Metro缓存:
    npx react-native start --reset-cache
    
  • 清理构建文件:
    • iOS:删除ios/build文件夹后重新构建
    • Android:删除android/build和android/app/build文件夹后重新编译

内容的提问来源于stack exchange,提问作者Yash Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:52:18