iOS端用Expo FileSystem.downloadAsync报400错误,Android正常
解决iOS上Expo FileSystem.downloadAsync 400 Bad Request问题
以下是针对该问题的排查和解决方向:
移除无效请求头
Access-Control-Allow-Origin是响应头,不需要在请求中携带。iOS网络层对无效请求头的校验更严格,直接删除该头;同时下载PDF的GET请求通常不需要Content-Type头,多余的头可能触发后端校验报错:headers : { 'Authorization': "Bearer " + data.jwt, 'X-CSRF-TOKEN': data.csrf, }对URL参数进行编码
如果data.documentId包含特殊字符(如斜杠、空格、非ASCII字符),iOS的URL解析逻辑和Android存在差异,需对参数做URL编码处理:const encodedDocumentId = encodeURIComponent(data.documentId); const file = await FileSystem.downloadAsync( config.API_DOC_URI + "/documents/pdf/download/" + encodedDocumentId, FileSystem.cacheDirectory + documentName, { /* 配置项 */ } )校验Token的有效性与格式
部分iOS设备可能因系统时间偏差导致JWT过期,或Token中的特殊字符在iOS端被错误解析:- 确认设备时间与服务器时间同步
- 打印
data.jwt和data.csrf内容,对比Android端的输出,确保无格式差异(如多余空格、换行)
抓包对比请求差异
用抓包工具(如Proxyman)捕获iOS和Android的请求,对比以下内容:- 请求URL的完整格式
- 所有请求头的键值对
- 请求方法(确认均为GET)
找出iOS请求中与Android不一致的地方,针对性调整。
更新Expo及相关依赖
旧版本的Expo FileSystem可能存在iOS特定bug,尝试更新到最新稳定版:expo update
内容的提问来源于stack exchange,提问作者Rami Ismail
相关产品推荐
相关产品推荐

