sandbox app入门
出差,帮同事一起做mac app开发。虽然cocoa和cocoa touch同出一源,但还是有许多不一样。例如NStableview 和uitable相差很大。这次主要负责一个小模块,点击按钮后弹出一个附属窗口,显示相关的动态信息,相对比较独立,可以充分学习利用mvc架构进行设计。现在开始如果要在mac store上发布应用,程序都要启用sandbox。因此,这里按图索骥,根据文档,将需要注意的地方说明一下。
2012-07-29 21:43:02
创建sandbox的几个步骤:
新建一个cocoa程序,然后选中target,在summary下,可以看到entitlement的选项,选中后程序自动生成一个entitlement的文件。然后你可以在下列选项中任意选择程序所需要的权限,选择后entitkement文件里会出现相应的键值对,见下图。
接着需要生成签名,启动keychain,选择证书助理-》创建证书,选项如图,记住证书的名字。
最后在project的build setting中搜索code sign,填入刚才证书的名字,这样运行一下,app就已经启用sandbox了。
想确认app是否已经启用sandbox,只要启动活动检测器,选中显示-》栏-》沙盒,这样就能看到程序是否运行在沙盒环境了。
另外,启用了沙盒环境的程序,NSHomeDirectory对应的文件夹形如:
/Users/yourName/Library/Containers/com.someting.appname/Data
你可以通过查看这个文件夹是否生成来确认。比如,qq已经是沙盒环境了,你可以在~/Library/Container/下找到响应的container。所以删除qq程序后,数据还保存在沙盒内,记得要一并删除,原因么,你懂的。
沙盒保证了程序只能访问沙盒container下的文件夹,这样就相对安全的保护了程序自身。对于用户想打开的磁盘其他位置的文件文件夹,系统通过powerbox的方式来予以支持。程序员无须知道powerbox的具体实现,因为他是通过entitlement设置权限,用NSOpenpanel和NSSavePanel来实现的。
下面简单说一下entitlement中的键值,也就是相应的访问权限。
1User-Selected File Access
可以访问使用NSOpenPanel和NSSavePanel打开的文件和文件夹。如果为程序启用sandbox,那么要注意有些NSOpenPanel和NSSavePanel的代理函数在沙盒下是不能使用的,否则在运行时会出错。
2Programmatic File Access
这里主要指的是以下文件夹: Downloads,Music,Movies,Pictures
3 Security-scoped bookmark and URL Access
security-scoped bookmark的概念是10.7.3后引入的,它旨在提高一个更安全的访问磁盘文件机制。启用沙盒后,程序不能访问沙盒外的数据,但是用户有可能需要打开或者下载文件保存到沙盒以外的位置。security-scoped bookmark就是用于此种情形。它有两种形式’
3.1 app-scoped bookmark: 提供访问用户制定文件或文件夹的权限
3.2 document-scoped bookmark:提供对特定文件的永久访问权限,比如某个文件含有嵌入式存在其他地方的图片或音频。
一般情况下,首先询问用户是否要使用那个图片或音频,然后创建一个bookmark,并作为文件数据的一部分而存储下来。而且任何能够访问此文件的app,都能使用该bookmark。
4Network access
不多说
5Hardware Access
照相,麦克风,USB,打印
6Personal Information Access
地址簿,日历,位置
sandbox与程序代码签名
众所周知,app需要签名,entitlement也是要被打进签名中去的。这样程序创建好沙盒的container,每次启动时,系统会检测程序的签名是否和container的签名信息相符。如果不符,系统就阻止程序运行。
一般我们有两种证书:development和distribution。在测试的时候,我们都会测试这两种环境。但在测试distribution版本的时候,系统会检测到签名和程序container的签名信息不符,从而无法运行程序的问题。为了解决这个问题,就需要人为修改,在teminal中
asctl container cal -file <path to your app>
这样distribution版本的app就能运行了。同时,也能利用asctl工具查看container所需要的签名’
asctl container cal list -bundle <container name>
前面创建sandbox程序过程中,有一步是代码签名。而我们都知道,程序开发的时候使用development和distribution证书来签名,放到app store上则由apple自己来签名。程序被打包签名的时候,entitlement也被添加进去了。这样,启动程序前,系统会检测签名信息和container需要的信息是否一致,如果不一致那么就阻止程序运行。很显然,apple签名所用的证书和开发时候所用的证书是全然不同的,如果要测试在store环境下的程序,就需要用到asctl工具给container添加相应的信息,比如在命令行:
asctl container cal -file <path to your app>
这样apple签名的版本app就能运行了。同时,也能利用asctl工具查看container所需要的签名’
asctl container cal list -bundle <container name>
如果想给已有app启用sandbox,那么需要注意:
1 程序数据文件的存储路径不同,原来在
~/Library/Application Support/<app_name>/
如今在沙盒内: ~Library/Containers/<bundle_id>/Data/Library/Application/Support/<app_name>/
2 NSOpenPanel,NSSavePanel的某些代理函数不能使用
以上是使用sandbox中的心得,如有不正确的地方,请批评。