Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos NSDocumentController openDocument:面板不再允许访问OS X 10.11 El Capitan中的应用程序iCloud容器_Macos_Cocoa_Icloud_Osx Elcapitan - Fatal编程技术网

Macos NSDocumentController openDocument:面板不再允许访问OS X 10.11 El Capitan中的应用程序iCloud容器

Macos NSDocumentController openDocument:面板不再允许访问OS X 10.11 El Capitan中的应用程序iCloud容器,macos,cocoa,icloud,osx-elcapitan,Macos,Cocoa,Icloud,Osx Elcapitan,我有一个OS X/iOS应用程序,它使用老式的无处不在的容器id TEAMID.com.companyname.product,并且在OS X上使用NSDocument,在iOS上使用UIDocument构建 使用内置的NSDocumentController-openDocument:面板,在OS X 10.8、10.9和10.10上文件打开工作正常。在10.10版本中,苹果扩展了该面板,以允许访问iCloud驱动器。在面板顶部,标题为“iCloud Library”的选择器显示“Appnam

我有一个OS X/iOS应用程序,它使用老式的无处不在的容器id TEAMID.com.companyname.product,并且在OS X上使用
NSDocument
,在iOS上使用
UIDocument
构建

使用内置的
NSDocumentController-openDocument:
面板,在OS X 10.8、10.9和10.10上文件打开工作正常。在10.10版本中,苹果扩展了该面板,以允许访问iCloud驱动器。在面板顶部,标题为“iCloud Library”的选择器显示“Appname-iCloud”和“iCloud Drive”作为选项。 选择前者可访问App ubiquity容器中的文档,选择后者可显示可用的iCloud驱动器文件夹

在10.11 El Capitan中,选择“Appname-iCloud”-视图不会改变(您可以看到iCloud驱动器文件夹的顶层视图)。没有警告信息。在侧栏中选择iCloud下的Appname会得到相同的结果

考虑到应用程序的性质(数据是私有的,不能被任何其他应用程序读取),将ubiquity文件夹公开并不理想,因此我不想走这条路

解决方法是在请求面板中搜索适当的文件类型(种类),然后选择search:This Mac-这很好,就像以前打开的保存的URL一样。因此,应用程序沙箱并不是问题的根源


很明显,我希望10.10的行为能够继续下去,但如何做到这一点,或者这是否是一个bug,还不清楚。苹果可能认为所有使用NSDocument构建的应用程序都希望将其应用程序容器公开。

这个问题似乎是OS X 10.11中的一个缺陷,并且标准的
NSDocument
文件打开/保存/移动面板无法强制进入旧行为。但是,一个相当简单的解决方案是提供两个新的应用程序菜单项:

  • 打开iCloud列出(私有)ubiquity容器中的所有可用文档
  • 使用
    [NSDocument moveDocumentToUbiquityContainer:][code>移动到iCloud

您需要将以下内容添加到info.plist文件中,从而使应用程序iCloud容器公开

<key>NSUbiquitousContainers</key>
    <dict>
        <key>HHWT75NS6T.au.com.ossh.appName</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>None</string>
        </dict>
    </dict>
NSUbiquitousContainers
HHWT75NS6T.au.com.ossh.appName
NSUBiquitousContainersDocumentScopePublic
支持的双层集装箱
没有一个

我可以确认,在iOS上向应用程序plist添加适当的NSUbiquitousContainers键,并将nsubiquitouscontainersdocumentscopepublic设置为true(并将CbundLeverVersion设置为bump),会立即使容器在iOS和OS X上都可见。不幸的是,这不是我想要的:-(感谢Duncan,我知道上述情况。问题是这会使您的ubiquity容器公开。对于我的应用程序来说,将其公开是不合适的(因为文件格式也不是公开的)。文件请求者的行为发生了变化,这将破坏任何不希望将应用程序ubiquity容器公开的类似应用程序。Well public意味着另一个应用程序(如Finder或ICloud Drive)可以看到其内容。这意味着您可以以通常的Finder方式在容器中复制文件。许多应用程序都有专有的格式,只要您使用适当的文档类型定义,这应该不会是一个问题。当然,我不太了解您的用例,但唯一的选择是编写您自己的文件管理器。顺便说一句,我不相信这是一个错误,因为我在前一段时间记录了一个错误,它已关闭-“按设计工作”。