Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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
Cocoa touch NSMetadataQuery找不到NSFileWrapper文件夹包,只找到文件(但它们在那里)_Cocoa Touch_Nspredicate_Icloud_Uidocument_Nsfilewrapper - Fatal编程技术网

Cocoa touch NSMetadataQuery找不到NSFileWrapper文件夹包,只找到文件(但它们在那里)

Cocoa touch NSMetadataQuery找不到NSFileWrapper文件夹包,只找到文件(但它们在那里),cocoa-touch,nspredicate,icloud,uidocument,nsfilewrapper,Cocoa Touch,Nspredicate,Icloud,Uidocument,Nsfilewrapper,我有一个奇怪的问题,我似乎无法独自解决。任何帮助或想法都将不胜感激 问题: NSMetadataQuery查找普通文件(如test.txt),但不查找文件包装器 捆绑包(myWrapperDocument.pro) 但是,NSFileManager会在我的ubiquity容器中找到所有文件——因此文件都在那里,但NSMetadataQuery没有找到它们 事实: 使用NSFileWrappers的基于UIDocument的应用程序 共享无处不在的容器(适用于iOS和桌面应用程序) 在Mac

我有一个奇怪的问题,我似乎无法独自解决。任何帮助或想法都将不胜感激

问题:

  • NSMetadataQuery查找普通文件(如test.txt),但不查找文件包装器 捆绑包(myWrapperDocument.pro)
  • 但是,NSFileManager会在我的ubiquity容器中找到所有文件——因此文件都在那里,但NSMetadataQuery没有找到它们
事实:

  • 使用NSFileWrappers的基于UIDocument的应用程序
  • 共享无处不在的容器(适用于iOS和桌面应用程序)
  • 在Mac OS上运行非常完美
  • 在我的iPadMini、iPhone4S和iPhone3GS(运行iOS6和iOS5)上运行非常完美
  • 不适用于我的iPad1,也不适用于我的beta测试仪的大多数设备(运行iOS5或iOS6的iPad1、2和3)
到目前为止我做了什么:

  • 研究了WWDC12 UIDocument和iCloud示例(CloudNotes.xcodeproj)
  • 在苹果的开发者论坛和这里学习了几个小时,不幸的是没有任何运气
  • 测试了许多不同的谓词,检查了权限和文档设置(因此系统知道它不是一个文件夹,而是一个文档包)
  • 清除和重置Ubiquity容器
相关代码:

权利应该是正确的; Info.plist文档设置(我认为文档类型已正确注册)

真正奇怪的是,查询只返回一个文件“test.txt”,而其他文件仍然未被检测到。但是从日志中可以看到,容器有84个.pro文件(全部称为“something.pro”),但是查询只找到一个“test.txt”。

不幸的是,使用NSFileManager访问这些文件不是一个选项,因为我似乎没有读取这些文件的权限。我认为我的容器没有损坏,因为这个问题也发生在我的beta tester设备的新安装上

2013-02-18 +++ found 1 results: ("<NSMetadataItem: 0x3ac390> /private/var/mobile/Library/Mobile Documents/ABCD123456~de~ac~prowriting/Documents/test.txt")
2013-02-18 +++ Results in iCloud folder: 84
我真的不知道该怎么办了。 最奇怪的是,它在某些设备上工作,而在其他设备上却完全不工作


我将非常感谢任何关于这个问题的暗示。非常感谢

奇怪的是,我不得不从info.plist文件中删除LSItemContentTypes设置:

<key>LSItemContentTypes</key>
  <array>
    <string>de.ac.prowriting.sketch</string>
  </array>
LSItemContentTypes
de.ac.prowriting.sketch
此设置就是我导出的自定义UTI filewrapper文件类型未正确识别为文件,而是被解释为文件夹的原因。NSMetadataQuery不查询文件夹,这就是它找不到我的任何文件的原因


不幸的是,我还有一个Mac应用程序,我的自定义文件类型在桌面上正确注册,影响了移动文档iCloud文件夹;这就是为什么它在我的大多数设备上都能工作,但在我的所有测试人员上都不能工作的原因。

与其搜索文件名谓词,不如使用UTI类型树谓词格式

我使用以下方法返回给定文件URL处的所有文件、文件夹、包和捆绑包:

NSMetadataQuery *query = [NSMetadataQuery new];
[query setSearchScopes:@[url]];

NSPredicate *filePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeData];
NSPredicate *bundlePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeBundle];
NSPredicate *packagePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypePackage];
NSPredicate *folderPredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeFolder];

NSPredicate *searchPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[filePredicate, bundlePredicate, packagePredicate, folderPredicate]];

[query setPredicate:searchPredicate];

如果转到,软件包是否作为软件包显示和/或下载?如果您将谓词更改为搜索“foo.pro”(一个实际文件),这是否有效?是的,包显示为文件,而不是文件夹。找不到Foo.pro(但找到了Foo.txt)。此外,并非所有设备都会受到影响,在某些设备上,它工作正常,而在另一些设备上则根本不受影响。我认为这一定与FileWrapper/文件夹有关:我猜NSMetadataQuery不报告文件夹与同时忽略这些文件夹的内容之间存在冲突,因为它们注册为捆绑包。如果捆绑包注册不正确,我希望列出包装内容,但事实并非如此。不确定问题可能是什么。我有一个运行良好的包/文件夹的实现。使用%K==foo.pro作为谓词对我来说是可行的,您是否也有一个共享的无处不在的文档文件夹,还是使用“默认”文件夹?在我处理的第一个iCloud项目中,我有一个LSItemContentType。在我的最新项目中,我也没有LSItemContentType或CbundleDocumentType。FWIW,我遇到了这个关于调试/清除UTI的链接。我也有类似的问题。即使当我将应用程序切换到iCloud时,我可以看到iCloud文件夹中的数据,但它不会得到任何结果,但如果我重新启动应用程序,它会得到任何结果。这是在模拟器上发生的,我删除了LSItemContentTypes@zambono:对于iCloud,我强烈建议使用真实设备,而不是模拟器。听起来你的问题不一样。我的问题是文件夹包没有正确注册,因此系统解释(=忽略)文件夹,而不是将其视为文件。设备上仍然存在此问题。我已将LSTypeIsPackage设置为true,删除包标识符听起来有悖直觉。我在应用程序中有多个文档。一个很好,另一个不行。两者的设置方式相同。请转到登录并导航到您的iCloud文件夹。如果您将文档视为文件,则您遇到了另一个问题。如果您将文档视为文件夹,或者(很可能)将文件夹的内容视为单个文件,那么您和我一样也有同样的问题。在这种情况下,您需要检查LSItemContentType声明,以确保iCloud将您的文件视为文件包装包,而不是文件夹(因此被NSMetadataQuery忽略)。我将其视为具有适当扩展名的文件。顺便说一下,我可以在模拟器中通过查询获得文件,但不能在设备上。我使用的是iOS 7和Xcode 5。如果我使用路径,我也可以获取文件及其内容,它只是一个不返回任何结果的查询。
@"%K like '*.pro*'"                // returns nothing
@"%%K like '*.*'"                  // returns only the test.txt file
@"%%K like '*'"                    // returns only the test.txt file
@"%K LIKE *"                       // returns only the test.txt file
@"NSMetadataItemFSNameKey == '*'"  // returns only the test.txt file
<key>LSItemContentTypes</key>
  <array>
    <string>de.ac.prowriting.sketch</string>
  </array>
NSMetadataQuery *query = [NSMetadataQuery new];
[query setSearchScopes:@[url]];

NSPredicate *filePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeData];
NSPredicate *bundlePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeBundle];
NSPredicate *packagePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypePackage];
NSPredicate *folderPredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeFolder];

NSPredicate *searchPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[filePredicate, bundlePredicate, packagePredicate, folderPredicate]];

[query setPredicate:searchPredicate];