macOS启用App Sanbox后CLI工具无法访问路径的问题
macOS启用App Sanbox后CLI工具无法访问路径的问题

macOS启用App Sanbox后CLI工具无法访问路径的问题

在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

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注