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

iOS系统下Expo相机首次授权后黑屏 重启应用才可正常使用 求解决方案

问题根因排查

    1. 状态更新存在闭包陷阱:现有代码中setCameraState使用作用域内捕获的旧cameraState对象,权限授予后的状态更新无法正确触发相机组件重渲染。
    1. iOS权限授予后相机实例失效:iOS系统在用户首次同意相机权限后,此前预加载的相机实例会被系统冻结,仅修改加载状态无法激活失效实例,重启应用后实例重新初始化才恢复正常。
    1. 相机组件挂载时机错误:相机组件在权限授予前就已挂载,权限状态变更后没有触发组件重新初始化。

修复方案

  1. 状态更新改用函数式写法,确保始终拿到最新的状态快照
  2. 授权成功后通过key属性触发相机组件完全重挂载,或调整逻辑直到权限明确授予后再挂载相机组件
  3. 权限被拒绝时正确跳转,避免无效挂载相机组件

修改后的代码示例

const __startCamera = async () => {
  // 状态更新改用函数式写法避免闭包问题
  setCameraState(prev => ({
    ...prev,
    previewVisible: false,
    showConnectionError: false,
    showConfirmPage: false,
    showConfirmSuccess: false,
    capturedImage: undefined,
  }));
  const { status } = await Camera.requestCameraPermissionsAsync();
  console.log(status);
  if (status === "granted") {
    console.log("granted", status);
    setCameraState(prev => ({
      ...prev,
      isLoading: false,
      // 新增权限授予标记,用于绑定相机组件的key触发重挂载
      cameraPermissionGranted: true
    }));
  } else {
    Alert.alert(t("camera.cameraPermissionError"));
    setCameraState(prev => ({
      ...prev,
      isLoading: true,
    }));
    navigation.navigate("Home");
  }
}

// 相机组件渲染处修改,仅权限授予后渲染且绑定key自动重挂载
// {cameraState.cameraPermissionGranted && <Camera key={Date.now()} style={styles.camera} />}

故障截图

相机黑屏截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:06:05