Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.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
Iphone 在iOS中为mime类型或UTI类型使用内置图标 问题:_Iphone_Ios_Uidocumentinteraction - Fatal编程技术网

Iphone 在iOS中为mime类型或UTI类型使用内置图标 问题:

Iphone 在iOS中为mime类型或UTI类型使用内置图标 问题:,iphone,ios,uidocumentinteraction,Iphone,Ios,Uidocumentinteraction,我希望能够在二进制文件内容列表中使用标准mime类型(或UTI类型)的内置iOS图标 背景: 我已经考虑过使用新的(自3.2版起)文档体系结构,但是使用UIDocumentInteractionController,似乎假设实际的二进制文件已经在本地设备上 在我的例子中,我有一个来自远程服务器的文件列表,并且知道远程文件的mime类型、名称、标题等,所以我只想显示一个带有图标的文件列表(实际的二进制文件仅在需要时加载) 我从服务器获取的元数据包含二进制文件的适当mime类型,因此理论上我只想基于

我希望能够在二进制文件内容列表中使用标准mime类型(或UTI类型)的内置iOS图标

背景: 我已经考虑过使用新的(自3.2版起)文档体系结构,但是使用UIDocumentInteractionController,似乎假设实际的二进制文件已经在本地设备上

在我的例子中,我有一个来自远程服务器的文件列表,并且知道远程文件的mime类型、名称、标题等,所以我只想显示一个带有图标的文件列表(实际的二进制文件仅在需要时加载)

我从服务器获取的元数据包含二进制文件的适当mime类型,因此理论上我只想基于该类型获取系统图标

工作? 我已经尝试了以下“黑客”作为概念的证明,它似乎工作,但这似乎不是最好的方式去

//Need to initialize this way or the doc controller doesn't work
NSURL*fooUrl = [NSURL URLWithString:@"file://foot.dat"];
UIDocumentInteractionController* docController = [[UIDocumentInteractionController interactionControllerWithURL:fooUrl] retain];

UIImage* thumbnail = nil;
//Need to convert from mime type to a UTI to be able to get icons for the document
NSString *uti = [NSMakeCollectable(UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)self.contentType, NULL)) autorelease];

//Tell the doc controller what UTI type we want
docController.UTI = uti;

//The doc controller now seems to have icon(s) for the type I ask for...
NSArray* icons = docController.icons;
if([icons count] > 0) {
    thumbnail = [icons objectAtIndex:0];
}
return thumbnail;

所以我们说的是黑客,嗯?我做了一些不好的事情,但它起作用了。。。
我从/system/library/frameworks/QuickLook.framework复制了图标,并将其添加到我的项目中。在同一个文件夹中,有一些属性列表,它们在UTI/extension/mime类型与png文件之间建立了链接。使用plist和png,您所要做的就是创建一个逻辑来读取plist并显示正确的png。

您可以创建一个
UIDocumentInteractionController
,而无需指定URL。该类的标题表示图标由
name
确定(如果设置),否则由
URL
确定

UIDocumentInteractionController* docController = [[UIDocumentInteractionController alloc] init];
docController.name = @"foo.dat";
NSArray* icons = docController.icons;
// Do something with icons
...
[docController release];
我试过了,但无论是在模拟器中还是在我的iPad3上,它在iOS6.1上都不起作用。您需要向
UIDocumentInteractionController
提供
NSURL
,但该URL不需要存在。它的最后一个路径组件只需要具有您想要的扩展名

下面的代码对我有用

NSString *extension = @"pptx"; // or something else
NSString *dummyPath = [@"~/foo" stringByAppendingPathExtension:extension]; // doesn't exist
NSURL *URL = [NSURL fileURLWithPath:dummyPath];
UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
NSArray *systemIconImages = documentInteractionController.icons;

return systemIconImages;

是的,理想情况下,我希望有一个更正式的方法,没有任何黑客攻击。但是,感谢您提供了有关基本图标来源的详细信息。我没有深入研究过。嗨,“/system/library/frameworks/QuickLook.framework”你指的是Mac还是iPhone?谢谢这个建议有两个问题:1。它不考虑用户设备上存在的图标(如果安装了特定的应用程序来处理特定的文件类型)和2。使用苹果的图标可能会导致拒绝,因为这显然违反了规则。谢谢,这是完美的,应该是公认的答案!这在iOS 6.1中似乎不起作用。我在模拟器和设备上都试过了。刚刚在模拟器的iOS 7项目上试过。调试器按预期向我显示具有UIMappedBitmapImage值的数组。我正在使用此解决方案,效果很好,但最近我遇到了未知文件类型的问题。例如,如果文件为anyFile.supal,则会显示dropbox图标(dropbox安装在我的设备中)。有什么办法可以解决这个问题吗?我刚刚找到了解决办法->1。编辑.plist文件2。查找文件类型->项目0->处理程序等级3。将该值更改为OwnerPlease file a radar,并将其复制到openradar。我会复制它。@arif-fanstatic苹果创建的API有多糟糕。这是一个完全不同的惊人的苹果,创造了神奇的硬件和蹩脚的苹果,创造了API。谢谢你,阿里夫!基本思想仍然有效,但在iOS 10中,即使实际文件不需要存在,包含的目录也必须存在,并且必须能够包含用户文档,例如文档和库/缓存,但是~,开发者、库和应用程序支持不能。注意:在iOS 10中,图标数组可以返回空的,即使文档中说它总是返回一些东西。您能标记为正确吗?听起来好像对人有用。