You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo中处理Base64格式PDF文件下载分享时无法打开的问题求助

问题根因

该报错是Android系统权限限制导致:你写入PDF的路径属于App私有沙盒目录,除当前App外的其他第三方应用(比如系统PDF阅读器)没有直接访问权限,使用Linking.openURL调用外部应用打开私有目录文件就会触发该权限错误。

解决方案

方案1:调用系统分享/外部PDF应用打开(适合需要导出、分享文件的场景)

该方案使用Expo官方的expo-sharing库处理跨应用文件访问权限,不需要额外原生配置。

  1. 安装依赖
npx expo install expo-sharing
  1. 修改代码,替换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资源,不需要写入本地文件,无权限问题。

  1. 安装依赖
npx expo install react-native-webview
  1. 直接加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:27:04