macOS: 沙盒(sandbox)机制

9,196 阅读3分钟

沙盒机制

苹果沙盒机制指的是应用(app)只能在系统独立分配的一块存储空间区域里去使用,包括写入读取等都是在这块区域里,想要访问沙盒外的数据需要得到系统的授权权限。

macOS 与 iOS 沙盒机制区别

  • OSX 沙盒路径不管是xcode的程序或已装机的APP,若开启沙盒权限,都是在固定目录下(/Users/admin/Library/Containers/..)
  • iOS 沙盒路径: xcode的程序放在xcode的一个缓存目录下,真机调试放在手机相对应程序的目录下

这里对OSX系统的沙盒文件做下介绍使用方法

OSX自从10.6系统开始引入沙盒机制,规定发布到Mac AppStore的应用,必须遵守沙盒约定。

创建Xcode工程macos项目时,需勾选沙盒开启功能,并一定要选择sign签名证书,因为沙盒的文件缓存目录是以签名后的Bundle ID为名称创建最外层文件夹的

其中沙盒权限下有若干选项可根据自己的需求选择:
 1.Network:网络访问控制
   Incoming Connections(Server) :应用做为Server对外提供HTTP,FTP等服务时需要打开
   Outgoing Connections(Client) :做为客户端,访问服务器时需要打开
2.Hardware:硬件资源控
  Printing为必须勾选。App的默认第一个顶级菜单中有打印功能的子菜单。
  Camera (相机)
  Micophone (麦克风)
  USB (USB插口)
  Printing
3.App Data:获取系统的联系人,位置,日历服务时需要打开
  Contacts
  Location
  Calendar
4.File Access:文件和用户目录的访问控制,分为禁止none,只读,读写3类
  User Selected File:文档类应用或者需要用户选择打开某个文件时,需要选择合适的访问权限.
  Downloads Folder
  Pictures Folder
  Music Folder
  Movies Folder

上图的沙盒配置表示应用需要连接服务器获取数据;应用菜单中有打印功能的菜单;

沙盒配置信息存储

选择配置了沙盒的访问控制信息后,Xcode会自动保存到一个扩展名为.entitlements的plist文件中

应用打包时会对这个文件进行签名

沙盒中每个需要访问权限的项都对应一个key,对应的value,YES 或 NO表示是否允许访问。

应用运行期间要获取某个权限时,系统都会通过.entitlements去检查应用是否有授权,如果没有就拒绝访问。

文件目录访问 (利用NSUserDefaults)

OSX相对iOS要更为开放一些,比如在访问应用文件目录,是可以在电脑的文件目录下找到的

比如我们想要用OC的NSUserDefaults区存储一些可以快速访问的数据,下面我们就来举例说明一下如何在文件中找到这些存储文件所在目录位置

此时打印路径为

沙盒缓存地址:/Users/admin/Library/Containers/SD.OSXkeepgoing/Data/Library

com+shift+G ,快捷键快速访问文件夹

可以看到当前macos应用所创建的沙盒目录,其中Documents与Library为固有文件夹,其他的文件都为OSX系统文件的替身镜像文件夹。而我们之前NSUserDefaults所保存的数据都是以plist表的形式保存在

../Library/Preferences/XXX.plist