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

React Native中Expo SecureStore的iOS Face ID仅二次调用才弹出问题

Expo SecureStore iOS生物验证首次不触发问题排查及解决

问题现象

使用Expo SecureStore存储会话令牌时,已设置requireAuthentication: true,但iOS设备首次调用setItemAsync时不会弹出Face ID验证窗口,只有连续调用两次、或删除存储项后再次调用两次才会触发验证。核心代码如下:

await SecureStore.setItemAsync(
  'session',
  JSON.stringify({
    ...JSON.parse(session),
    refreshToken,
  }),
  {
    requireAuthentication: true,
  },
);

可能原因

  1. SecureStore内部状态未初始化完全:首次调用setItemAsync时,SecureStore的生物验证触发标记未正确生效,第二次调用时状态更新才触发验证流程。
  2. iOS生物验证上下文建立延迟:第一次调用时,应用与系统生物验证服务的交互上下文还未完全建立,第二次调用时系统才正确唤起验证窗口。
  3. 旧版本SDK存在bug:部分早期版本的expo-secure-store存在生物验证触发逻辑的漏洞,导致首次调用不生效。

解决方案

1. 前置调用getItemAsync触发验证

在执行setItemAsync前,先调用一次getItemAsync获取目标key的内容(即使为空),提前触发生物验证流程:

// 先触发生物验证
await SecureStore.getItemAsync('session', { requireAuthentication: true });
// 再执行存储操作
await SecureStore.setItemAsync(
  'session',
  JSON.stringify({
    ...JSON.parse(session),
    refreshToken,
  }),
  {
    requireAuthentication: true,
  },
);

2. 升级Expo SDK及相关包

检查并升级到最新版本的Expo SDK和expo-secure-store,修复已知bug:

expo upgrade
# 或单独升级指定包
npx expo install expo-secure-store@latest

3. 手动前置生物验证

使用expo-local-authentication包先完成用户身份验证,通过后再执行SecureStore的存储操作:

import * as LocalAuthentication from 'expo-local-authentication';

// 先验证生物身份
const authResult = await LocalAuthentication.authenticateAsync({
  promptMessage: '请验证身份以存储会话',
});

if (authResult.success) {
  // 验证通过后执行存储
  await SecureStore.setItemAsync(
    'session',
    JSON.stringify({
      ...JSON.parse(session),
      refreshToken,
    }),
    { requireAuthentication: true },
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:13:24