iOS系统下Expo相机首次授权后黑屏 重启应用才可正常使用 求解决方案
问题根因排查
- 状态更新存在闭包陷阱:现有代码中
setCameraState使用作用域内捕获的旧cameraState对象,权限授予后的状态更新无法正确触发相机组件重渲染。
- 状态更新存在闭包陷阱:现有代码中
- iOS权限授予后相机实例失效:iOS系统在用户首次同意相机权限后,此前预加载的相机实例会被系统冻结,仅修改加载状态无法激活失效实例,重启应用后实例重新初始化才恢复正常。
- 相机组件挂载时机错误:相机组件在权限授予前就已挂载,权限状态变更后没有触发组件重新初始化。
修复方案
- 状态更新改用函数式写法,确保始终拿到最新的状态快照
- 授权成功后通过key属性触发相机组件完全重挂载,或调整逻辑直到权限明确授予后再挂载相机组件
- 权限被拒绝时正确跳转,避免无效挂载相机组件
修改后的代码示例
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
相关产品推荐
相关产品推荐

