Expo 51调用FileSystem.createDownloadResumable.downloadAsync()时iOS崩溃
解决方案:Expo 51 iOS端FileSystem下载崩溃无报错问题
问题定位
Expo 51升级后iOS端调用FileSystem.createDownloadResumable().downloadAsync()直接崩溃,try-catch无法捕获,核心原因是Expo 51配套的expo-file-system@~17.0.1在iOS端存在底层异常未被JS层封装的问题,导致异常直接触发应用终止。
修复步骤
1. 升级expo-file-system到兼容补丁版本
Expo官方后续补丁已修复该崩溃问题,执行以下命令更新依赖:
npx expo install expo-file-system@~17.0.5
(17.0.5及以上版本已处理iOS端底层异常的JS层捕获逻辑)
2. 全局捕获未处理原生异常(临时兼容方案)
若暂时无法升级依赖,可通过Expo的ErrorUtils捕获JS层try-catch无法覆盖的原生异常:
import { ErrorUtils } from 'expo'; // 在App初始化阶段注册全局异常处理器 ErrorUtils.setGlobalHandler((error, isFatal) => { if (isFatal) { console.error('致命底层错误:', error); // 可在此添加错误上报或用户提示逻辑 } });
3. 校验下载路径合法性
Expo 51对iOS文件路径权限校验更严格,确保uriFile是通过Expo提供的合法目录生成:
import * as FileSystem from 'expo-file-system'; // 正确生成保存路径的方式 const savePath = `${FileSystem.documentDirectory}target-file.ext`;
禁止使用自定义绝对路径,避免触发权限或路径解析崩溃。
额外排查点
- 检查iOS的
Info.plist网络权限配置:若下载链接为HTTP,需添加NSAppTransportSecurity例外;HTTPS链接需确保证书有效。 - 清理Expo构建缓存:执行
npx expo start --clear,排除旧缓存导致的兼容问题。
内容的提问来源于stack exchange,提问作者Aha00a
相关产品推荐
相关产品推荐

