Mac OSX自从10.6系统开始引入沙盒机制,规定发布到Mac AppStore的应用,必须遵守沙盒约定。沙盒对应用访问的系统资源,硬件外设,文件,网络,XPC,都做了严格的限制,这样能防止恶意的App通过系统漏洞,攻击系统,获取控制权限,保证了OSX系统的安全。
沙盒相当于给每个App一个独立的空间,你只能在自己的小天地里面玩。要获取自己空间之外的资源必须获得授权。
苹果爸爸规定:我们程序刚刚启动的时候是不能去访问沙盒之外的路径的,苹果默认只允许访问APP它自己沙盒的内容是不受限制的,如果要访问沙盒之外的路径是需要用户授权的,我们可以调用NSOpenPanel 类 弹出一个对话框给用户去选择他要打开的文件,当用户点击了OK按钮,则表示用户已经授权了这个文件,这个时候我们需要通过bookmark去保存这个已经授权的文件路径信息(我们可以保存到系统偏好Prefer里面,使用UserDefaults.standard.set(url, forKey: LastSaveFilePathKey)),下次App启动的时候,直接从bookmark获取到URL ,然后调用allowedURL = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope|NSURLBookmarkResolutionWithoutUI relativeToURL:nil bookmarkDataIsStale:&bookmarkDataIsStale error:NULL]; 函数获取到授权的URL, 这个时候我们去访问url路径下的文件,可以直接访问,它原理用户给定的是什么权限,现在就可以得到什么权限。不需要再次弹出对话框让用户去选择路径授权了。