Expo React Native iOS发布版调用AbortController.abort后崩溃求助
修复Expo iOS发布版中fetch abort导致的崩溃问题
问题分析
在Expo React Native的iOS发布版中,调用AbortController.abort()会导致应用无错误崩溃,但开发环境正常。这通常是因为iOS发布版中fetch的AbortController实现存在兼容性问题,或未正确处理中止请求时抛出的AbortError。
修复方案
方案1:显式捕获并处理AbortError
在catch块中明确判断错误类型,避免未处理的异常触发崩溃:
const controller = new AbortController(); const { signal } = controller; fetch('xxxxxxxxx/system/sleep3000ms', { signal }) .then(async r => { const rr = await r.json(); console.log(rr); }) .catch(error => { // 明确捕获AbortError,避免崩溃 if (error.name === 'AbortError') { console.log('请求已中止'); return; } console.error('请求出错:', error); }); setTimeout(() => { console.log('abort'); controller.abort(); }, 1000);
方案2:使用axios替代原生fetch
axios的取消请求机制在Expo iOS发布版中兼容性更稳定,实现方式如下:
import axios from 'axios'; const CancelToken = axios.CancelToken; const source = CancelToken.source(); axios.get('xxxxxxxxx/system/sleep3000ms', { cancelToken: source.token }) .then(response => { console.log(response.data); }) .catch(error => { if (axios.isCancel(error)) { console.log('请求已中止:', error.message); } else { console.error('请求出错:', error); } }); setTimeout(() => { console.log('abort'); source.cancel('主动中止请求'); }, 1000);
使用前需安装axios:npm install axios或yarn add axios
方案3:升级Expo SDK版本
部分旧版Expo SDK的iOS打包存在AbortController的bug,升级到最新稳定版(如SDK 49+)可解决此类兼容性问题。
注意事项
- 测试时务必使用
expo build:ios生成发布版包进行验证,开发环境无法复现该问题
内容的提问来源于stack exchange,提问作者lacaci3709
相关产品推荐
相关产品推荐

