Xamarin.Forms iOS端用PCL Storage创建文件夹报错:路径访问被拒绝
解决Xamarin.Forms iOS端PCL Storage访问路径被拒绝的问题
问题根源
iOS采用沙箱机制,每个应用只能访问自己专属的沙箱目录,/var/root/是系统级根目录,应用完全没有读写权限,直接硬编码这个路径必然触发权限拒绝异常。
修复步骤
1. 替换iOS的硬编码路径
不要手动指定iOS的存储路径,改用PCL Storage提供的API获取应用合法的可读写目录,比如Documents目录(这是应用默认的持久化存储目录,完全有权限访问)。
2. 移除iOS端不必要的权限请求
StoragePermission是Android平台专属的权限,iOS不需要请求这个权限,直接跳过相关逻辑即可。
修改后的完整代码
private async void Button_Clicked(object sender, EventArgs e) { string path = string.Empty; if (Device.RuntimePlatform == Device.iOS) { // 获取iOS应用的Documents目录,无需硬编码 var documentsFolder = await FileSystem.Current.GetSpecialFolderAsync(SpecialFolder.MyDocuments); path = documentsFolder.Path; } else if (Device.RuntimePlatform == Device.Android) { path = "/storage/emulated/0/"; } await PCLReportGenaratePdf(path); } private async Task PCLReportGenaratePdf(string path) { try { if (Device.RuntimePlatform == Device.Android) { // 仅Android端需要检查存储权限 var status = await CrossPermissions.Current.CheckPermissionStatusAsync<StoragePermission>(); if (status != PermissionStatus.Granted) { status = await CrossPermissions.Current.RequestPermissionAsync<StoragePermission>(); } if (status != PermissionStatus.Granted) { // 权限被拒绝,添加你的处理逻辑 return; } } // 文件夹与文件创建逻辑保持不变 IFolder rootFolder = await FileSystem.Current.GetFolderFromPathAsync(path); IFolder folder = await rootFolder.CreateFolderAsync("HandSAppPdf", CreationCollisionOption.OpenIfExists); IFile file = await folder.CreateFileAsync("Hello.pdf", CreationCollisionOption.GenerateUniqueName); } catch (Exception ex) { // 异常处理逻辑 } }
额外说明
如果需要让生成的PDF在iOS的「文件」App中可见,需要在项目的Info.plist中添加以下配置:
- 开启
UIFileSharingEnabled(允许应用共享文件) - 开启
LSSupportsOpeningDocumentsInPlace(支持在原位置打开文档)
配置完成后,用户可通过「文件」App的「我的iPhone」>「你的应用名称」路径找到生成的PDF文件。
内容的提问来源于stack exchange,提问作者F.F
相关产品推荐
相关产品推荐

