Expo中处理Base64格式PDF文件下载分享时无法打开的问题求助
问题根因
该报错是Android系统权限限制导致:你写入PDF的路径属于App私有沙盒目录,除当前App外的其他第三方应用(比如系统PDF阅读器)没有直接访问权限,使用
Linking.openURL调用外部应用打开私有目录文件就会触发该权限错误。
解决方案
方案1:调用系统分享/外部PDF应用打开(适合需要导出、分享文件的场景)
该方案使用Expo官方的expo-sharing库处理跨应用文件访问权限,不需要额外原生配置。
- 安装依赖
npx expo install expo-sharing
- 修改代码,替换
Linking.openURL逻辑
import * as Sharing from 'expo-sharing'; // 其他原有导入保持不变 const generatePDF = async () => { const companyReponse = await CompanyService.getCompany(); const peopleResponse = await PeopleService.getPerson(sale.customerId); const company = companyReponse.response.company; const people = peopleResponse.response; const quote = false; const json = await SaleService.generatePDF({ sale, company, people, quote, }); await ensureFolderExists(); if (json && json.success) { const path = `${FileSystem.documentDirectory}MyFolder/Sale_${sale._id}.pdf`; await FileSystem.writeAsStringAsync(path, json.data, { encoding: FileSystem.EncodingType.Base64, }); // 替换原Linking逻辑 if (await Sharing.isAvailableAsync()) { await Sharing.shareAsync(path, { mimeType: 'application/pdf', // 适配安卓端类型识别 UTI: 'com.adobe.pdf', // 适配iOS端类型识别 dialogTitle: '打开/分享销售单PDF' }); } } };
方案2:应用内直接预览PDF(适合不需要跳出App的场景)
如果不需要导出/分享,仅要查看PDF,可以直接用WebView加载Base64资源,不需要写入本地文件,无权限问题。
- 安装依赖
npx expo install react-native-webview
- 直接加载Base64资源
import WebView from 'react-native-webview'; // 组件渲染逻辑,拿到base64数据后直接传入即可 <WebView source={{ uri: `data:application/pdf;base64,${json.data}` }} style={{ flex: 1 }} />
补充注意事项
- 如果需要将PDF保存到系统公共下载目录,可接入
expo-media-library,申请存储权限后将文件移入公共目录即可。 - 以上所有库均为Expo官方维护,无需原生配置,可直接在Expo Go环境运行。
内容的提问来源于stack exchange,提问作者Resende
相关产品推荐
相关产品推荐

