在macOS启用App Sanbox,使用entitlement.plist给第三方CLI工具(如pngquant)签名后,第三方CLI工具就会无法访问路径。

当我们把第三方CLI工具加入 .app 包中,并签名上传App Store后,它会被当成App的一部分。Apple要求所有二进制文件都启用App Sanbox,否则报错。
当我们启用App Sanbox后,非GUI程序(CLI工具)默认没有文件系统访问权限、无法读取/tmp、无法读取 ~/Library/Containers/等目录。
这是因为,我们在给第三方CLI工具签名时,设置了App Sandbox:
com.apple.security.app-sandbox = true
第三方CLI工具就会变成一个“独立沙盒”程序,无法访问主程序允许访问的文件路径(如 NSTemporaryDirectory()、图片文件等),因为沙盒之间是隔离的。
解决方案
设置com.apple.security.inherit为true:
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
它表示这个 CLI 工具进程将继承调用它的沙盒主应用的权限,不再有自己的沙盒隔离配置。

重新给第三方CLI工具签名:
codesign --force --sign "Developer ID Application: ..." \
--entitlements inherit-entitlements.plist \
/路径/to/pngquant
总结
主应用必须开启App Sandbox。

所有访问的文件路径(如主程序用的 NSTemporaryDirectory() 生成的路径)都必须是主应用有权限访问的。
参考文章
1、How to sandbox a command line tool?:https://stackoverflow.com/questions/12959958/how-to-sandbox-a-command-line-tool