我正在开发一个支持 iCloud 的应用程序,用户将能够通过 iCloud Drive 导入和导出文件。在使用UIDocumentPickerViewController
(iOS 8) 或 Finder (OS X Yosemite) 浏览 iCloud Drive 时,我可以看到由其他支持 iCloud-Drive 的应用程序创建/拥有的目录,例如 Automator、Keynote 或 TextEdit。
我希望我们的应用程序也能在 iCloud Drive 中公开其无处不在的文档目录,但还没有弄清楚。在上述一些应用程序的Info.plist
文件中,我发现了这个键:
<key>NSUbiquitousContainers</key>
<dict>
<key>com.apple.TextEdit</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
这些键也记录在这里,但我还没有找到关于更广泛主题的任何其他文档。编辑/注意:虽然它不包含我的问题的答案,但文档选择器编程指南是一个有用的资源。
我尝试将上述键/值添加到我们的应用程序中,但没有看到任何效果。我注意到/尝试过的事情:
对于 3rd 方应用程序,iCloud 容器是这样构建的:
iCloud.$(CFBundleIdentifier)
. 我不确定为什么 TextEdit 只使用纯包标识符,但对于我们的标识符,我尝试了两种方法,即有前缀和没有iCloud.
前缀。我还认识到您需要对捆绑标识符进行硬编码(即不要使用iCloud.$(CFBundleIdentifier)
),因为似乎只有 PLIST 的值在构建时才被解析,而不是键。我以编程方式(到)添加了一个子目录,
<containerPath>/Documents
因此容器不为空。但是,这无关紧要,因为所有其他应用程序的目录最初也是空的。出现在 iCloud Drive 中的某些 Apple 应用程序在其 中没有这些条目
Info.plist
,例如 Numbers 和 Pages。iCloud 设置正确,我可以使用
[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
.我登录到启用了 iCloud Drive 的 iCloud 帐户。我可以在
UIDocumentPickerViewController
.我使用 iOS 8 beta 5 模拟器(和 Yosemite beta 5 在 Mac 上查看 iCloud Drive 目录)(编辑/注意:这同样适用于 beta 6)
这就是我的权利文件的样子(仅相关部分)
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.$(CFBundleIdentifier)</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array/>
我已经在 Capabilities 部分使用 Xcode 的 UI 进行了设置。我不明白为什么最后一个键没有条目,但添加<string>iCloud.$(CFBundleIdentifier)</string>
没有帮助。相反,它使 Xcode 在 Capabilities UI 中抱怨,所以我将其删除。编辑/注意:在 Xcode beta 6 中,这已被修复,即需要设置普遍存在的容器标识符,Xcode 可以为您修复它。
原始问题:那么......这是一个错误吗?它还不工作吗?我做错了吗?我在发行说明中找不到已知问题。
编辑:
我尝试过的另外两件事:
NSUbiquitousContainerName
按照 Erikmitk 的建议,将(可选)键(+ 值)添加到特定于容器的字典中。仅将
NSUbiquitousContainerIsDocumentScopePublic
键/值添加到 PLIST 根字典而不是特定于容器的字典,就像在WWDC 示例应用程序之一中所做的那样(查找 NewBox)。