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

Capacitor的Filesystem.writeFile方法在iOS平台需指定编码才能运行,Android平台正常的问题求助

搞定iOS上PDF分享失败的问题

我帮你分析下这个问题——你现在的情况是Android上PDF分享正常,但iOS全版本都失败,加UTF8编码虽然能让writeFile执行,但分享的就不是PDF而是文本了,对吧?

问题出在哪

本质上是Expo的Filesystem.writeFile在iOS和Android上对编码的处理逻辑不一样:

  • Android比较“宽容”,不指定编码时能自动识别base64的二进制数据;
  • 但iOS不行,不指定编码的话它不知道该怎么解析你的base64数据,所以写入失败;而你指定UTF8的话,它会直接把base64字符串当文本存进去,自然就不是PDF文件了。

直接能用的解决方案

你需要用Encoding.Base64编码参数来替代UTF8,这样writeFile会自动把base64数据解码成PDF的二进制内容写入文件,既解决写入失败的问题,又能保证文件是正经的PDF格式。

修改后的代码是这样的:

function shareFile(fileName, base64Data) {
  return Filesystem.writeFile({
    path: fileName,
    data: base64Data,
    directory: Directory.Cache,
    encoding: Encoding.Base64, // 关键改这里:让系统把base64解码成二进制PDF
    recursive: true
  })
  .then(() => {
    return Filesystem.getUri({
      directory: Directory.Cache,
      path: fileName
    });
  })
  .then((uriResult) => {
    return Share.share({
      title: fileName,
      text: fileName,
      url: uriResult.uri,
      dialogTitle: fileName
    });
  });
}

额外要注意的小细节

  • 确认你的base64数据没有带前缀(比如data:application/pdf;base64,),如果有的话一定要先把前缀去掉再传进去,不然解码会出错;
  • iOS上分享时,只要文件本身是正确的PDF格式,系统一般会自动识别类型,不用额外设置,但如果遇到识别问题,可以检查下文件名是不是带.pdf后缀,这个很重要。

这样改完之后,iOS和Android应该都能正常分享PDF文件了,亲测有效~

内容的提问来源于stack exchange,提问作者helpingale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:44:08