macOS Catalina下C++生成PDF后用Preview打开的权限问题如何解决
macOS Catalina下C++生成PDF后调用Preview打开的权限问题解决
问题背景
在macOS Catalina 10.15.7 + Xcode 11.3.1环境中,通过C++生成PDF文件后,调用Preview打开时遇到权限错误,操作流程如下:
- 写入PDF文件的代码:
FILE * fp = fopen("/Users/test/Documents/1.pdf", "w+"); if (fp) { fwrite(pdf_data, size_of_pdf_data, 1, fp); fclose(fp); }
- 调用Preview的代码:
system("osascript -e 'tell app \"Preview\" to open \"/Users/test/Documents/1.pdf\"'");
解决方法
1. 确认文件权限
首先检查生成的PDF文件权限是否正常:
- 打开终端,执行命令:
ls -l /Users/test/Documents/1.pdf
- 查看输出的权限列,确保当前用户拥有读权限(例如权限为
-rw-r--r--,当前用户权限位是rw-)。 - 如果权限不足,执行命令添加读权限:
chmod u+r /Users/test/Documents/1.pdf
2. 配置Xcode沙盒权限
macOS Catalina的沙盒机制会限制应用访问用户目录,需为Xcode项目添加权限:
- 打开项目的Signing & Capabilities页面,点击
+ Capability添加Files and Folders权限。 - 勾选
User Selected File,若需要固定访问Documents目录,可在Info.plist中添加NSDocumentsFolderUsageDescription键,填写访问说明(如"需要读取生成的PDF文件")。
3. 优化AppleScript调用方式
使用POSIX file让AppleScript正确识别系统路径,减少权限识别问题:
std::string open_cmd = "osascript -e 'tell application \"Preview\" to open POSIX file \"/Users/test/Documents/1.pdf\"'"; system(open_cmd.c_str());
4. 改用系统open命令(推荐)
直接使用系统open命令绕开AppleScript的权限限制,更简洁可靠:
system("open -a Preview /Users/test/Documents/1.pdf");
内容的提问来源于stack exchange,提问作者xscript09
相关产品推荐
相关产品推荐

