文章目录
Mac 开发(二) 苹果沙盒机制sandbox 苹果官方文档详解
1. app 沙盒 checklist
如果你已经按照本书的指导方针采用了应用沙箱,你应该准备好通过Mac应用商店或直接向用户分发你的应用。但在此之前,每次发布应用程序的新更新时,使用这个检查表来验证应用程序是否遵循了最佳实践。
- 确保你的应用程序使用了它的权利文件中的每一个权利。如果你的应用程序不需要授权,把它从授权文件中删除。
- 确保你的应用包中包含的所有Mach-O可执行文件都启用了沙箱。每个Mach-O可执行文件都必须有一个授权文件,并请求
com.apple.security.app-sandbox entitlement.
权限。这包括XPC服务和请求com.apple.security.inherit
的权限。他们还必须申请com.apple.security.app-sandbox
权限。
清单5-1在可执行的Mach-O二进制文件上运行file命令。
$ file /Applications/Safari.app/Contents/MacOS/Safari
/Applications/Safari.app/Contents/MacOS/Safari: Mach-O universal binary with 2 architectures
/Applications/Safari.app/Contents/MacOS/Safari (for architecture i386): Mach-O executable i386
/Applications/Safari.app/Contents/MacOS/Safari (for architecture x86_64): Mach-O 64-bit executable x86_64
清单5-2在不可执行的Mach-O二进制文件上运行file命令。
$ file /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation: Mach-O universal binary with 2 architectures
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (for architecture i386): Mach-O dynamically linked shared library i386
您可以使用以下命令查找已编译的应用程序包中的所有Mach-O可执行文件。
find -H YourAppBundle -print0 | xargs -0 file | grep "Mach-O .*executable"
- 确保授权中指定的每个文件系统路径都以
'/'
开头。这包括绝对路径和相对于当前用户主目录的路径。另外,请确保“~”
字符不会出现在与用户主目录相关的路径中。 - 确保你的应用程序不是为了让它跳过打开或保存对话框来为用户读取或写入文件而请求文件访问异常。例如,对
Desktop
或Documents
文件夹的访问必须始终由用户发起。不要为这些位置请求异常。 - 确保你的应用程序不是为了允许它访问另一个应用程序的数据或系统的数据而请求文件访问异常。沙箱应用程序不能依赖于对它们没有创建或没有被显式访问的文件的读或写访问。
- 确保你的应用程序没有为它已经可以访问的位置请求文件访问异常。每个沙箱应用程序都被隐式地授予访问其自身容器之外系统上的各种目录的权限。这些目录包含所有应用程序操作的通用文件,例如
/bin
和/System/Library/Frameworks
。请求这些位置的异常是多余的。在请求异常之前,您应该能够演示一个用例,如果不存在异常,该用例将会遇到沙盒冲突。 - 如果你的应用程序请求
com.apple.security.temporary-exception.apple-events
权限或com.apple.security.temporary-exception.mach-lookup.global-name
权限,确保您为权利的值提供了字符串数组,这在权限键引用中有详细说明。在为这些权利指定值时要具体。没有一个值可以允许你的应用访问用户系统上安装的每个应用。 - 如果手动编辑权限文件,而不是使用Xcode中的属性列表编辑器,请确保没有引入任何语法错误。授权文件必须包含有效的属性列表结构。可以使用
plutil
命令检查授权文件中的语法错误。一个常见的错误是在指定布尔值时输入YES/NO,而不是语法正确的true/false。
清单5-3在有语法错误的权利文件上运行plutil
命令。
$ plutil Invalid-Entitlements.plist
Invalid-Entitlements.plist: Encountered unknown tag YES on line 6
清单5-4在语法正确的授权文件上运行plutil
命令。
$ plutil Valid-Entitlements.plist
Valid-Entitlements.plist: OK
2. App沙盒快速搭建
在这个快速启动的过程中,您将获得一个macOS应用程序并在沙箱中运行。您验证应用程序确实是沙箱的,然后学习如何排除故障并解决一个典型的应用沙箱错误。你使用的应用程序是Xcode,活动监视器,终端和控制台。