Xamarin.iOS访问项目内置PDF文件报错:找不到路径如何解决
在Xamarin.iOS中访问嵌入PDF文件的正确方式
首先,你遇到的问题核心是没有正确获取iOS应用bundle中嵌入文件的路径,而且大概率没设置好文件的生成操作,导致文件根本没被打包到app里。我给你一步步解决:
1. 先确保PDF文件的生成操作设置正确
在你的Xamarin.iOS项目中,右键点击MyDocs/File.pdf,选择「属性」:
- 把生成操作设置为
BundleResource - 把复制到输出目录设置为
如果较新则复制
这一步是基础,如果没做,这个PDF文件不会被打包到最终的app bundle里,自然会提示找不到。
2. 修改FileGet.GetFile方法的实现
iOS应用的安装路径是系统动态分配的(就是你错误日志里那串长串路径),不能直接用相对路径MyDocs/File.pdf访问。必须通过NSBundle来获取文件的绝对路径,修改后的代码如下:
using System.IO; using UIKit; namespace MyApp.MyDocs { public static class FileGet { public static Stream GetFile() { // 从app bundle中获取指定文件夹下的PDF路径 string filePath = NSBundle.MainBundle.PathForResource("File", "pdf", "MyDocs"); if (string.IsNullOrEmpty(filePath)) { throw new FileNotFoundException("未找到File.pdf,请检查文件是否存在且生成操作设置正确"); } return new FileStream(filePath, FileMode.Open, FileAccess.Read); } } }
这里PathForResource的三个参数分别是:文件名(不带后缀)、文件后缀、所在的文件夹名称,这样就能准确拿到文件的绝对路径了。
3. 关于这种存储方式是否合适
如果这个PDF是固定不变的模板文件(比如你说的固定页面),那么把它作为BundleResource嵌入项目是非常合适的:
- 它会被打包到app安装包中,不需要额外下载
- 路径获取稳定,不会被用户误删
- 适合作为静态资源使用
如果以后你需要动态更新这个PDF(比如从服务器下载新版本),那时候再考虑把文件存到Documents目录等可读写的位置就好,目前的场景用这种方式完全没问题。
你的调用代码不需要修改,保持原来的写法就能正常获取到文件流了。
内容的提问来源于stack exchange,提问作者jarjar27
相关产品推荐
相关产品推荐

