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
相关产品推荐
相关产品推荐

