NSMetadataQuery 忽略自定义文件包类型
Posted
技术标签:
【中文标题】NSMetadataQuery 忽略自定义文件包类型【英文标题】:NSMetadataQuery ignoring custom file package type 【发布时间】:2012-01-26 22:16:30 【问题描述】:我正在使用UIManagedDocument
s 来管理我在 iCloud 中的文件。像这样设置NSMetadataQuery
后:
iCloudQuery = [[NSMetadataQuery alloc] init];
[iCloudQuery setSearchScopes:
[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
[iCloudQuery setPredicate:
[NSPredicate predicateWithFormat:@"%K like %@", NSMetadataItemFSNameKey, @"DocumentMetadata.plist"]];
我遇到了一个奇怪的问题 - 当我的文档被命名为没有文件扩展名(例如 @"NewDocument2"
)或像 .txt
这样的公共扩展名时,元数据查询会正确找到 DocumentMetadata.plist
文件。但是,当使用我的自定义文件扩展名时,查询永远不会找到任何东西......不是在查询开始时,也不是在我添加新文档时。
在我看来,查询可能正在查看我的文档及其自定义文件扩展名,并没有意识到它实际上是一个 目录(无论如何是一个文件包),并且所以不要往里找DocumentMetadata.plist
文件。但是,我已经在应用程序的 info.plist
中声明了我的自定义 UTI。
也许我错误地申报了我的尿路感染?我在创建它时遵循了 Apple 的指南(在 Document-Based App Programming Guide for ios 和 Uniform Type Identifiers Overview 中),但似乎出了点问题。
编辑:在info.plist
的“Exported UTIs”下,我的类型设置为符合“com.apple.package”。
编辑: 我仍在努力解决这个问题。我现在正在通过不使用文件扩展名来解决它。
使用自定义文件扩展名时,我在处理iCloud元数据查询结果,DocumentMetadata.plist
文件肯定在文件包里面,但是元数据查询看不到。枚举查询结果时,会在日志中打印以下内容:
<iCloud Container URL>/Documents/
<iCloud Container URL>/Documents/New%20Document.spdoc/
<iCloud Container URL>/Documents/New%20Document.spdoc/DocumentMetadata.plist
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/(A%20Document%20Being%20Saved%20By%20<AppName>%202)/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/(A%20Document%20Being%20Saved%20By%20<AppName>)/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/.persistentStore_SUPPORT/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/.persistentStore_SUPPORT/_EXTERNAL_DATA/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/persistentStore
(“CoreDataLogs”目录下还有一堆文件,但为了简洁我没有在这里展示)。
我只能认为这个问题与我错误地创建了我的文件包UTI有关。有没有其他人成功使用 iCloud 的自定义文件包?这是一个错误吗?
【问题讨论】:
我自己仍在努力克服 UIManagedDocument 的痛苦。这不是一个真正的答案,但您可能需要考虑将 UIManagedDocuments 存储在“Documents”文件夹之外。否则,当用户进入 Settings->iCloud->Storage & Backup->Manage Storage->这是设计使然。
API 也以这种方式适用于 Spotlight。它不应该归结为包文档,因为这些文档的内容基本上是私有的。使用 iCloud,这并没有多大意义,但我怀疑他们不会改变它。 API 根据使用的位置以两种不同的方式工作是没有意义的。
我想这是一件历史性的事情——在 Mac 上,您可以实现一个 Spotlight 导入器来处理您的自定义文档类型。在 iOS 上,我认为这还不可能(如果我错了,请纠正我)。所以现在,您只需要解决 API 的这个“功能”。
您可以改为搜索文档,然后从那里获取元数据。否则,按照您所做的那样链接扩展程序应该可以工作。
【讨论】:
【参考方案2】:升级到 iOS 5.1 beta 3 或更高版本。我不相信 UIManagedDocument + iCloud 在 iOS 5.0 中完全有效。
【讨论】:
实际上我最近确实升级到了最新的 5.1 测试版,但由于当前 Xcode 4.3 预览版中令人难以置信的代码折叠/缩进错误,我很快就恢复到了 5.0。在使用最新的测试版时,这个文件包问题仍然存在。以上是关于NSMetadataQuery 忽略自定义文件包类型的主要内容,如果未能解决你的问题,请参考以下文章