我正在开发一款支持iCloud的应用程序,用户将能够通过iCloud Drive导入和导出文件。当使用UIDocumentPickerViewController
(iOS 8)或Finder(OS X Yosemite)浏览iCloud Drive时,我可以看到其他支持iCloud的应用程序创建/拥有的目录,例如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>
这些键在此处也有记录,但我没有找到其他更广泛主题的文档。 编辑/注释:虽然它不包含我的问题答案,但Document Picker编程指南是一个有用的资源。我尝试将上述键值添加到我们的应用程序中,但没有看到任何效果。 我注意到/尝试过的事情:
对于第三方应用程序,iCloud容器是这样构建的:
iCloud。$(CFBundleIdentifier)
。 我不确定为什么TextEdit仅使用纯束缚标识符,但对于我们的标识符,我尝试了两种方法,即带有和不带有iCloud。
前缀。 我还意识到您需要硬编码束缚标识符(即不要使用iCloud。$(CFBundleIdentifier)
),因为只有PLIST的值似乎在构建时解析,而不是键。我已经通过编程方式添加了一个子目录(到
<containerPath>/Documents
),因此容器不为空。 但是,这不应该重要,因为所有其他应用程序的目录最初也是空的。出现在iCloud Drive中的某些Apple应用程序在其
Info.plist
中没有这些条目,例如Numbers和Pages。iCloud已正确设置,并且我可以以编程方式查看通过
[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]
返回的URL中的普及容器。我登录了启用了iCloud Drive的iCloud帐户。 我可以在
UIDocumentPickerViewController
中看到我的iCloud Drive内容。我使用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/>
我已经在Xcode的“功能”部分使用UI进行设置。我不明白为什么最后一个键没有输入,但添加<string>iCloud.$(CFBundleIdentifier)</string>
没有帮助。相反,这使得Xcode在功能UI中抱怨,所以我已经将其删除。编辑/注:在Xcode beta 6中,已经修复了这个问题,即需要设置普及容器标识符,Xcode可以为您解决。
原始问题: 那么...这是一个bug吗? 它还不能工作吗? 我做错了吗?我在发布说明中找不到已知问题。
编辑:
我尝试了两个更多的东西:
向容器特定字典中添加(可选的)
NSUbiquitousContainerName
键(+值),如Erikmitk建议的那样。仅向PLIST根字典添加
NSUbiquitousContainerIsDocumentScopePublic
键/值,而不是容器特定字典中的键/值,就像在其中一个WWDC示例应用程序(寻找NewBox)中所做的那样。