macOS启用App Sandbox的应用无法访问桌面文件该如何解决
问题原因
这个报错是App Sandbox的访问限制导致的。开启沙盒后,应用默认被隔离在独立的沙盒目录中,仅允许读写自身沙盒内的文件,无法直接访问桌面、下载、文稿等用户个人目录,未开启沙盒的应用默认拥有用户级别的全目录访问权限,所以可以正常运行。
解决方案
方案1:临时例外配置(仅适合不上架Mac App Store的内部应用)
直接在项目的entitlements文件中添加目录访问例外:
- 打开项目中后缀为
.entitlements的配置文件 - 添加如下权限项:
- 键:
com.apple.security.temporary-exception.files.home-relative-path.read-write,类型为Array,添加子项字符串/Desktop/ - 同时确保
com.apple.security.app-sandbox值为YES
- 键:
配置完成后重新编译运行即可直接访问桌面目录文件。注意这个临时例外权限无法通过Mac App Store审核,仅适合内部自用应用使用。
方案2:标准权限申请(符合Mac App Store审核要求)
按照苹果沙盒规范,应用需要通过系统文件选择器NSOpenPanel让用户主动选择目标文件/目录,用户确认后应用即可获得对应路径的访问权限,还可以通过安全书签持久化权限,避免每次启动都要重新选择:
示例代码:
// 导入需要的头文件 #import <CoreServices/CoreServices.h> // 弹出文件选择器让用户选择桌面的csv文件 NSOpenPanel *panel = [NSOpenPanel openPanel]; panel.directoryURL = [NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop"]]; panel.allowedFileTypes = @[(__bridge NSString *)kUTTypeCommaSeparatedText]; panel.allowsMultipleSelection = NO; [panel beginWithCompletionHandler:^(NSModalResponse result) { if (result == NSModalResponseOK) { NSURL *selectedUrl = panel.URL; NSError *error = nil; NSString *string = [NSString stringWithContentsOfURL:selectedUrl encoding:NSUTF8StringEncoding error:&error]; NSLog(@"读取结果:%@,错误:%@", string, error); // 如果需要持久化权限,可以将selectedUrl生成安全书签存储到本地,下次启动直接读取书签恢复权限 } }];
如果需要申请整个桌面的持续访问权限,可以将NSOpenPanel设置为选择目录模式,用户选中桌面目录后应用即可获得整个桌面的读写权限。
方案3:全磁盘访问权限(适合特殊用途应用)
如果应用确实需要访问全磁盘的用户文件,可以在entitlements中添加com.apple.security.files.user-selected.read-write权限,同时引导用户到「系统设置→隐私与安全性→全磁盘访问」中手动给你的应用开启权限,开启后即可访问包括桌面在内的所有用户文件。
内容的提问来源于stack exchange,提问作者user3570727
相关产品推荐
相关产品推荐

