原文地址:http://www.skyfox.org/cocoa-macos-sandbox.html

iOS默认并且只能读写对应的沙盒目录。

OSX自从10.6系统开始引入沙盒机制,规定发布到Mac AppStore的应用,必须遵守沙盒约定。沙盒对应用访问的系统资源,硬件外设,文件,网络,XPC,都做了严格的限制,这样能防止恶意的App通过系统漏洞,攻击系统,获取控制权限,保证了OSX系统的安全。沙盒相当于给每个App一个独立的空间。要获取自己空间之外的资源必须获得授权。

macOS APP不需要上架的时候,可以不开启Sandbox 功能,可以随意访问mac上的文件。

当未开启Sandbox功能上传到APPStore的时候提示:

iTunes Store operation failed.
App sandbox not enabled. The following executables must include the “com.apple.security.app-sandbox” entitlement with a Boolean value of true in the entitlements property list: [( “org.skyfox.ProfilesTool.pkg/Payload/ProfilesTool.app/Contents/MacOS/ProfilesTool” )] Refer to App Sandbox page at https://developer.apple.com/devcenter/mac/app-sandbox/ for more information on sandboxing your app.

#开启Sandbox

App Sandbox

在Xcode工程target设置Tab的Capabilities中选择 App Sandbox 为ON即可开启使用沙盒,Xcode自动生成.entitlements权限配置文件到工程。并且可以配置相应的权限,(网络,硬件,App Data,文件访问)

Network:网络访问控制

Incoming Connections(Server) :应用做为Server对外提供HTTP,FTP等服务时需要打开
Outgoing Connections(Client):做为客户端,访问服务器时需要打开

Hardware:硬件资源控, Printing为必须勾选。App的默认第一个顶级菜单中有打印功能的子菜单:

Camera
Micophone
USB
Printing

###App Data:获取系统的联系人,位置,日历服务时需要打开:
Contacts
Location
Calendar

File Access:文件和用户目录的访问控制,分为禁止none,只读,读写3类:

User Selected File:文档类应用或者需要用户选择打开某个文件时,需要选择合适的访问权限.
Downloads Folder
Pictures Folder
Music Folder
Movies Folder
如果应用中不需要的权限项,一律不要打开。否则App Review团队会拒绝你的应用上架

#entitlements权限配置信息存储
沙盒中每个需要访问权限的项都对应一个key,对应的value,YES 或 NO表示是否允许访问。选择配置了沙盒的访问控制信息后,Xcode会自动保存到一个扩展名为.entitlements的plist文件中

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

#Sandbox之外的文件怎么访问?

那么问题就出现了,开启Sandbox 功能之后,NSHomeDirectory对应的文件夹形如:
/Users/yourName/Library/Containers/com.xxxx.appname/Data
程序数据文件的存储路径也不同,原来在
~/Library/Application Support/<app_name>/
如今在沙盒内:
~Library/Containers/<bundle_id>/Data/Library/Application/Support/<app_name>/
沙盒保证了程序只能访问沙盒container下的文件夹,这样就相对安全的保护了程序自身。
#访问沙盒外部文件

一、让用户人为选择目录

Capabilities中选择 App Sandbox ,在File Access中User Selected File项中选择Read/Write文件读写权限
沙盒有个默认的规则。在App运行期间通过NSOpenPanel用户手动打开的任意位置的文件,把这个这个路径保存下来,后面都是可以直接用这个路径继续访问获取文件内容的。
但是App重新启动后,这个文件路径就不能直接访问了。要想永久的获得应用的Container目录之外的文件,这里必须讲一下Security-Scoped Bookmark。

Security-scoped bookmarks:

使用bookmarks之前同样要在.entitlements文件中填写对应的key与value
Security-scoped bookmarks有2种:

1. An app-scoped bookmark

能为已沙盒程序提供对用户指定文件和文件夹的持久访问权。 例如,如果程序采用了一个程序容器外的下载或处理目标文件夹,通过 NSOpenpanel 对话框获得用户想使用该文件夹的初始访问权。
然后,为其创建一个 app-scoped bookmark,将它作为程序的配置储存(可能用属性列 表文件或 NSUserDefaults 类)。有了 app-scoped bookmark,程序就能获得对该文件夹的 未来访问权了。这种bookmark方式使用的比较多。

在.entitlements文件对应的key对应的权限key为com.apple.security.files.bookmarks.app-scope

2. A document-scoped bookmark

提供了对特定文档的持久访问权。可以理解为针对文档嵌套的一种权限模式。比如你开发一个能编辑ppt文档的应用,里面嵌入了视频文件,图片文件连接。那么下次打开这个ppt文档时就能直接访问这些文件而不需要在通过NSOpenPanel打开获得授权。

Document-scoped bookmark 只能指向文件而不是文件夹。并且这个文件必须不在系统使用的 位置上(如/private 或/Library)

在.entitlements文件对应的key对应的权限key为com.apple.security.files.bookmarks.document-scope

保存打开的文件URL的bookmark

获取到URL的bookmarkData存储到NSUserDefaults等位置
NSData *bookmarkData =[url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];

应用启动时通过URL的bookmark获取文件授权

通过bookmark数据解析获取授权的NSURL,并且执行startAccessingSecurityScopedResource方法得到访问权限。

执行block回调完成相关内容读取后,执行stopAccessingSecurityScopedResource停止授权。

NSURL *allowedUrl = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope|NSURLBookmarkResolutionWithoutUI relativeToURL:nil bookmarkDataIsStale:&bookmarkDataIsStale error:NULL];
@try {[allowedUrl startAccessingSecurityScopedResource];block();
} @finally {[allowedUrl stopAccessingSecurityScopedResource];
}

二、文件访问临时例外

在开启沙盒功能的App中,App仅可以访问container中的数据,application groupcontainer,POSIX可读的公开位置、用户手动Open或Save dialog打开的位置 。如果您的应用程序需要永久访问到其他位置,你可以通过启用本人所述的临时例外entitlement权限键将额外的位置带入你的沙盒
为每个您想要启用访问的路径,将路径指定为相应的entitlement权限key值数组。每个字符串必须以斜杠 (/) 字符开头 — — 它代表绝对路径或相对于用户的主目录的路径。如果您提供的是一个目录路径,你必须以斜杠字符串结束。

home-relative-path
临时例外, 提供一个相对于user home目录的路径。相对于~

例如我指定“/Library/MobileDevice/Provisioning Profiles/”目录用来读取系统的profies文件。

当我设置home相对路径后,在程序中要手动拼接上home目录。

拼接home路径有两种方式:

一种是getpwuid方法

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <assert.h>struct passwd *pw = getpwuid(getuid());
NSString *home =  [NSString stringWithUTF8String:pw->pw_dir];

一种是根据沙盒目录字符串截取

 NSString *home = NSHomeDirectory();NSArray *pathArray = [home componentsSeparatedByString:@"/"];NSString *absolutePath;if ([pathArray count] > 2) {absolutePath = [NSString stringWithFormat:@"/%@/%@", [pathArray objectAtIndex:1], [pathArray objectAtIndex:2]];}

absolute-path
临时例外, 提供一个绝对路径。相对于 /

Entitlement key Capability
com.apple.security.temporary-exception.files.home-relative-path.read-only 开启对于home指定子目录或者文件的只读权限
com.apple.security.temporary-exception.files.home-relative-path.read-write 开启对于home指定子目录或者文件的读写权限
com.apple.security.temporary-exception.files.absolute-path.read-only 开启对于 / 指定子目录或者文件的只读权限
com.apple.security.temporary-exception.files.absolute-path.read-write 开启对于 / 指定子目录或者文件的读写权限

macOS - Cocoa开发之沙盒机制及访问Sandbox之外的文件相关推荐

  1. iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据

    iOS开发:沙盒机制以及利用沙盒存储字符串.数组.字典等数据 1.初识沙盒:(1).存储在内存中的数据,程序关闭,内存释放,数据就会丢失,这种数据是临时的.要想数据永久保存,将数据保存成文件,存储到程 ...

  2. iOS开发之沙盒机制(SandBox)

    iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒.每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme.沙盒里面的文件可以是照片.声音文件. ...

  3. iOS 开发之沙盒机制 文件操作 (NSFielManager)

    原文链接:http://www.jianshu.com/p/349855b5a8ae iOS APP 可以在自己的沙盒里读写文件,但是,不可以访问其他 APP 的沙盒.每一个 APP 都是一个信息孤岛 ...

  4. ios沙箱软件_iOS 开发之沙盒机制

    1.iOS 沙盒机制简介 沙盒也叫沙箱,英文standbox,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中.在沙盒机制下,每个程序之间的文件夹不能互相访问.iOS系统为了保证系统安 ...

  5. Mac 开发(一) 苹果沙盒机制sandbox 简介

    文章目录 Mac 开发(一) 苹果沙盒机制sandbox简介 1 Mac sandbox简介 1.1 关于应用程序沙盒 1.2 为啥要用沙盒机制 2 沙盒原理 3 xcode中开启沙盒权限 3.1 X ...

  6. Mac 开发(一) 苹果沙盒机制sandbox简介

    Mac 开发(一) 苹果沙盒机制sandbox简介 孔雨露正在上传-重新上传取消 2020年06月07日 16:41 ·  阅读 7332 @[TOC] Mac 开发(一) 苹果沙盒机制sandbox ...

  7. (0051)iOS开发之沙盒(sandbox)机制和文件操作(一)

    1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...

  8. android强制选择器,谷歌手软了:不再强制在Android Q采用隔离存储沙盒机制

    原标题:谷歌手软了:不再强制在Android Q采用隔离存储沙盒机制 IT之家4月26日消息 在Android Q的首个Beta版中,谷歌推出了一个隐藏的.激进的隔离存储沙盒机制,名为"Sc ...

  9. IOS沙盒机制(SandBox)

    IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件 ...

最新文章

  1. 能源局再出新招 拟推光伏电站竞价上网
  2. 【运维人员应该掌握哪些常用技术】
  3. c++:MFC中sqlite3的使用(附实际案例)
  4. 北斗导航 | 北斗RDSS受地面5G干扰影响的分析及对策研究
  5. Boost.Flyweight 键值测试的类
  6. ***客户端出现“无法完成连接尝试”的解决方法
  7. HTML 5新增的元素
  8. NVIDIA硬编码方式:omxh264enc和nvv4l2h264enc
  9. 一幅图看懂prototype与[[Prototype]]
  10. PHP微信模版消息有时收不到_PHP微信开发之模板消息回复
  11. 汤国安 ARCGIS地理信息系统空间分析实验教程
  12. app如何控制手机横屏
  13. 计算机本地硬盘满了,本地磁盘C盘满了怎么清理?
  14. 均衡发展计算机教室解说词,均衡发展图书室解说词|小学图书室解说词开场白范文推荐...
  15. C++(类与对象)是纸老虎吗?
  16. 转载:常用 Git 命令清单 by 阮一峰
  17. 一文看懂摄像头测距技术
  18. jquery 遍历java对象_jquery中object对象循环遍历的方法
  19. ABOV A96R725 seting Music调谐器设置应用
  20. 台式win7f1到f12热键取消_Windows 7旗舰版系统中键盘F1到F12快捷键的作用详解

热门文章

  1. Mysql CASE方法条件怎么加and或or
  2. (P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程
  3. 判断字符串是否在base64编码范围内
  4. 如何表示Unicode的字符?
  5. 【智联沙龙活动】混合云云平台PaaS技术分享
  6. SECTION 24 面向对象编程(三)
  7. Linux7子网,rhel7_12336621的技术博客_51CTO博客
  8. 无极符和鸿蒙符哪个好,无极仙途内丹属性哪个好? 单属性与双属性内丹对比详解...
  9. OSError: exception: access violation writing,
  10. C# ComboBox 下拉选项框