在OpenClip游行中下雨

OpenClip项目于本周首次亮相,描述自己作为“一个非盈利,开源,社区努力的项目,它推动了iPhone的框架,允许用户在参与的应用程序之间进行复制/粘贴。”

与Apple假设的全系统剪贴板相比,明显的缺点是没有明确支持OpenClip方案的应用程序无法使用它 - 包括所有Apple的应用程序,如Mail和Safari这是可以预料的但它比这更糟糕。

Zac White的OpenClip框架是一个非常聪明的实现,是一个根本不明智的想法。怀特对项目的描述关于其内在问题,他自己的博客上相当公开该OpenClip.org但是,网站不是由白方托管和编写的,而是由Proximi,开发者背后MagicPad开发者FAQ状态:

它是如何工作的?

OpenClip利用iPhone上的共享空间Applications that use the OpenClip framework can access this common area to write to and read from, allowing copy/paste between participating apps.

这令我感到好奇,因为我不知道iPhone上有任何应用程序间的“共享空间”White自己对其工作方式的描述以及OpenClip源代码本身表明这样的描述是不诚实的他们的常规(即非开发者)常见问题在技​​术上更准确

OpenClip utilizes an application’s ability to read into other application’s Documents directoryApplications that use the OpenClip framework can access this read only area to read pastes from other applications and then OpenClip can offer the newest data to the current application.

OpenClip项目面临的根本问题是数据交换如果您在应用A中复制某些内容,并希望将其粘贴到应用B中,则剪贴板数据需要存在于应用A可以写入的位置(复制时),以及B可以读取的位置(粘贴时)On Mac OS X, the system provides this to Cocoa apps via theNSPasteboard类和相关的APIIndividual applications don’t have to worry about the details of how and where clipboard data is stored; it’s an implementation detail completely managed by the system.

但即使忽略Mac OS X的标准系统范围剪贴板,Mac上的应用程序在通过文件系统与其他应用程序交换数据时也不会遇到任何挑战在Mac上,所有应用程序都可以在整个主文件夹中随时随地读写因此,如果Mac应用程序A和B希望通过自定义文件格式相互共享数据,则他们都可以通过共享文件(例如用户的Documents文件夹)同意这样做。

iPhone应用无法做到这一点或者,更具体地说,第三方iPhone apps written with the official iPhone SDK can’t do that; Apple’s own iPhone apps can do whatever they want.

iPhone沙盒

The idea with沙盒是每个应用程序在自己的空间中执行,资源有限,无法更改或修改其自己的沙箱之外的任何内容缺点是Mac应用程序可以做的一些事情,但iPhone应用程序不可能做的事情(和/或非常酷)好处是那些相同的东西都有潜在危险(无论是在安全性方面还是在稳定性方面)这是一种权衡。

以下是沙盒在iPhone OS 2.0中的工作原理鉴于其与Mac OS X的共同根源,iPhone OS毫不奇怪地具有非常熟悉的文件系统布局系统的标准应用程序位于名为的顶级文件夹中/应用/,就像在Mac OS X上一样但是,通过App Store安装的应用程序不会去那里相反,这些应用程序有一个单独的Applications文件夹在iPhone OS 2.0中,该文件夹位于/私营/无功/移动/应用/,但它究竟在哪里并不重要(/私营/无功/移动/iPhone或多或少相当于你的主文件夹。)

每次安装应用程序时,都会在该“应用程序”文件夹中创建一个新的沙箱沙箱是一个以a命名的文件夹UUID例如,“68813987-A628-493F-90E2-A6ABCD922A89”应用程序本身安装在沙箱文件夹中,以及用于写入数据的自己的目录因此,如果您从App Store安装两个iPhone应用程序,名为“Foo”和“Bar”,它们将安装在两个单独的沙箱中,在文件系统级别看起来像这样:

/private/var/mobile/Applications/04A74595-4DE8-4026-8459-63B2D153D13C/
    Documents/
    Foo.app/
    Library/
    tmp/

/private/var/mobile/Applications/77C9A482-F5F8-4284-9E16-C629763B9162/
    Bar.app/
    Documents/
    Library/
    tmp/

每个应用程序都有自己的Documents文件夹,自己的Library文件夹,甚至是自己的临时临时空间(“tmp”)每个应用程序只能在其自己的沙箱目录中写入文件系统这不仅仅是Apple的指南 - 它由操作系统强制执行应用程序的任何尝试到其沙箱外的文件系统将失败。1

但是,在iPhone OS 2.0中,应用程序可以来自文件系统中的任何位置这是OpenClip工作原理的基础。

OpenClip如何工作

作为API,White的OCPasteboard类是Cocoa的NSPasteboard的克隆每一个NS随你调用标准的Cocoa NSPasteboard类hiearchy,OpenClip提供了相应的OC随你The advantage to this design is twofold: first, it’s exactly what Cocoa developers are accustomed to on the Mac; second, if Apple eventually ports NSPasteboard to the iPhone OS, it’s likely to have a very similar API.

当使用OpenClip的应用程序复制数据时,2它将数据写入其自己的Documents文件夹中的两个文件中:

Documents/
    OpenClip/
        OCGeneralPboard.data
        OCGeneralPboard.metadata
Foo.app/
Library/
tmp/

当使用OpenClip粘贴的应用程序时,OpenClip框架会窥视到Documents文件夹中文件系统中的每个其他应用程序沙箱,寻找最近修改过的OpenClip数据文件So if you have three apps, A, B, and C, and you copy something in A, then copy something else in B, then do a paste in C, C will paste the data copied from app B, because it was created more recently.

问题

On his weblog,白写道

How it works is relatively simple and doesn’t break the SDK agreementOpenClip works by looking into the Documents folder of other applications to get their pastesApplications are allowed to write all they want to their own Documents directory (for copy), so no foul thereApplications are also allowed to read outside their sandbox into the Documents directories for other apps (for paste), so no foul there.

这不准确这更像是“滑过一个暂时的漏洞”,而不是“没有犯规”在安全部分Apple的第4章iPhone OS编程指南,Apple将如下描述沙箱(粗体强调添加):

For security reasons, iPhone OS restricts an application and its preferences and data to a unique location in the file systemThis location is part of the security feature known as the application’s “sandbox.” The sandbox is a set of fine-grained controls limiting access to files, preferences, network resources, hardware, and so onIn iPhone OS, an application and its data reside in a secure location没有其他应用程序可以访问

不仅仅是没有其他应用程序可以写给,但没有其他应用程序可以访问此限制尚未在技术级别强制执行(例如应用程序尝试执行此操作的情况)在它自己的沙箱之外)并不意味着它是允许的。

事实上,在iPhone OS的2.1b4版本中,它强制执行OpenClip演示应用程序,在iPhone OS 2.0.2上宣传的功能,在目前的2.1测试版中不起作用,因为应用程序不再能够阅读甚至看到其他应用程序的沙箱。3To be clear, this change is clearly not in response to OpenClip; Apple began seeding the 2.1 betas with these tightened sandbox restrictions before OpenClip debuted, and theiPhone OS编程指南一直声明应用程序无法“访问”其他沙箱的内容。

iPhone应用程序没有“共享空间”来交换数据(我见过的一个解决方法是使用系统范围的通讯簿数据库作为共享剪贴板数据的存储位置Needless to say, such an implementation would not qualify as an intended use of the AddressBook framework.) Wishing it were otherwise doesn’t make it so.

OpenClip的意图很好那已经存在了非常覆盖关于OpenClip在过去24小时内显示了应用程序间复制和粘贴的需求量但是开发人员采用一种仅适用于今天的框架是愚蠢的,因为iPhone OS 2.0存在漏洞已经关闭在iPhone OS 2.1中。


  1. 除了安全性之外,这种结构还有另一个好处 - 当您删除应用程序时,系统可以轻松删除应用程序本身的所有应用程序数据No preference files or application support detritus can be left behind, because the entire sandbox folder is deleted when you delete the app. ↩︎

  2. 我的意思是“数据”,而不仅仅是文本OpenClip supports both text and images. ↩︎

  3. 在iPhone OS 2.1中,使用OpenClip的应用程序仍然可以在自身内部进行复制和粘贴,因为这只需要读取和写入应用程序自己的沙箱But you don’t need OpenClip for that. ↩︎