在 iOS 中为 mime 类型或 UTI 类型使用内置图标

Posted

技术标签:

【中文标题】在 iOS 中为 mime 类型或 UTI 类型使用内置图标【英文标题】:Using built-in icons for mime type or UTI type in iOS 【发布时间】:2011-05-03 23:29:04 【问题描述】:

问题:

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

背景:

我已经研究过使用新的(自 3.2 起)文档架构,但使用 UIDocumentInteractionController 似乎假设实际的二进制文件已经在本地设备上。

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

我从服务器获得的元数据包含二进制文件的正确 mime 类型,所以理论上我只想根据类型获取系统图标。

解决办法?

我尝试了以下“hack”作为概念证明,它似乎有效,但这似乎不是最好的方法......

//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;

【问题讨论】:

你能把***.com/a/14880929/9636标记为正确吗?听起来它对人有用。 【参考方案1】:

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

UIDocumentInteractionController* docController = [[UIDocumentInteractionController alloc] init];
docController.name = @"foo.dat";
NSArray* icons = docController.icons;
// Do something with icons
...
[docController release];

【讨论】:

谢谢,这很完美,应该是公认的答案! 这似乎不适用于 iOS 6.1。我在模拟器和设备上都试过了。 刚刚在模拟器中的一个 iOS 7 项目上试过这个。调试器按预期向我显示了具有 UIMappedBitmapImage 值的数组。【参考方案2】:

我试过Ben Lings's solution,但它在iOS6.1 的模拟器或我的iPad3 上都不起作用。您需要向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;

【讨论】:

我正在使用这个解决方案,效果很好,但最近我遇到了未知文件类型的问题。例如,如果文件是 anyFile.supal,它会显示保管箱图标(保管箱已安装在我的设备中)。有什么办法可以解决这个问题? 我刚刚找到解决方案 -> 1. 编辑 .plist 文件 2. 查找文档类型 -> 项目 0 -> 处理程序排名 3. 将值更改为所有者 请归档一个雷达,并将其复制到 openradar。我会复制它。 @arif - Apple 创建的 API 多么糟糕。这是创造出色硬件的神奇苹果和创造 API 的蹩脚苹果之间的完全对比。谢谢阿里夫! 基本思想仍然有效,但在 iOS 10 中,即使实际文件不需要存在,包含目录也必须存在,并且必须是可以包含用户文档的目录,例如文档和库/缓存可以工作,但开发人员、库和应用程序支持却不行。另请注意,在 iOS 10 中,图标数组可以返回空,即使文档说它总是返回一些东西【参考方案3】:

所以我们在谈论黑客,嗯?我通过做一些坏事来做到这一点,但它正在工作...... 我从 /system/library/frameworks/QuickLook.framework 复制了图标并添加到我的项目中。在同一个文件夹中,有一些属性列表,它们在 UTI/extension/mime-type 与 png 文件之间建立了链接。使用 plist 和 pngs,您所要做的就是创建一个逻辑来读取 plists 并显示正确的 png。

【讨论】:

是的,理想情况下,我希望有一种更官方的方法,没有任何黑客攻击。但是感谢您提供有关底层图标来源的详细信息。我没有深入研究。 嗨,“/system/library/frameworks/QuickLook.framework”您指的是 Mac 还是 iPhone?谢谢 这个建议有两个问题:1. 它不考虑用户设备上存在的图标(如果安装了特定的应用程序来处理特定的文件类型)和 2. 使用 Apple 的图标可能会导致在拒绝中,因为这显然违反了规则。

以上是关于在 iOS 中为 mime 类型或 UTI 类型使用内置图标的主要内容,如果未能解决你的问题,请参考以下文章

在 javax.mail api 中为 mime 多部分/相关消息的内容类型设置“开始”属性

如何在 .NET Core 中为没有文件扩展名的文件设置 MIME 类型?

如何在 axios 中为 POST - multipart/form-data 设置 MIME 类型?

第三方统一类型标识符实现?

iOS 文档/文件类型关联 - 通配符 UTI?

带有 UIDocumentPickerViewController 的 iOS 自定义 UTI/文件类型