【发布时间】:2011-01-27 04:43:30
【问题描述】:
我有一个 iPhone 程序,它应该在给定文件名列表的情况下执行智能操作(为文件类型挑选适当的图标)。我正在寻找 iPhone 上的 /etc/mime.types 或类似的东西——我假设 API 调用可用于手机。这存在吗?
【问题讨论】:
标签: iphone objective-c cocoa cocoa-touch
我有一个 iPhone 程序,它应该在给定文件名列表的情况下执行智能操作(为文件类型挑选适当的图标)。我正在寻找 iPhone 上的 /etc/mime.types 或类似的东西——我假设 API 调用可用于手机。这存在吗?
【问题讨论】:
标签: iphone objective-c cocoa cocoa-touch
如果是这样,您的应用肯定没有权限直接读取它。你想做什么?
编辑
这是我前段时间写的一个函数。我是为 Mac 编写的,但看起来 iPhone 上存在相同的功能。基本上,你给它一个文件名,它使用路径扩展名来返回文件的 MIME 类型:
#import <MobileCoreServices/MobileCoreServices.h>
...
- (NSString*) fileMIMEType:(NSString*) file {
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)[file pathExtension], NULL);
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
CFRelease(UTI);
return [(NSString *)MIMEType autorelease];
}
【讨论】:
Does not work on iPhone - 我的错。您需要包含 MobileCoreServices 框架和#import <MobileCoreServices/MobileCoreServices.h>
以下函数将返回 Swift 2
中给定文件扩展名的 mime 类型import MobileCoreServices
func mimeTypeFromFileExtension(fileExtension: String) -> String? {
guard let uti: CFString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension as NSString, nil)?.takeRetainedValue() else {
return nil
}
guard let mimeType: CFString = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() else {
return nil
}
return mimeType as String
}
【讨论】:
在 obj-C 中,警告使用 C 时内存泄漏。
- (NSString *)guessMIMETypeFromFileName: (NSString *)fileName {
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[fileName pathExtension], NULL);
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
CFRelease(UTI);
if (!MIMEType) {
return @"application/octet-stream";
}
NSString *dest = [NSString stringWithString:(__bridge NSString *)(MIMEType)];
CFRelease(MIMEType);
return dest;
}
【讨论】:
更新对 Swift 5.3 的优秀且被接受的答案,作为 URL 扩展
extension URL {
var mime: String {
guard
let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)
else { return "" }
let mime = uti.takeRetainedValue() as String
uti.release()
return mime
}
}
【讨论】: