我正在编写一种方法,从给定的文件扩展名获取MIME类型:
private class func mime(from utType: UTType) -> String? {
let mimeType: String
if let preferredMIMEType = utType.preferredMIMEType {
mimeType = preferredMIMEType
} else {
return nil
}
return mimeType
}
public class func convertToMime(fileExtension: String) -> String? {
var utType: UTType? = UTType(filenameExtension: fileExtension)
var mimeType: String?
if let utType = utType {
mimeType = mime(from: utType)
}
return mimeType
}测试通过了txt和mp4类型,而不是pkpass。
func testThatConvertToMimeConvertsFileExtensions() {
XCTAssertEqual(UTIHelper.convertToMime(fileExtension: "pkpass"), "application/vnd.apple.pkpass")
XCTAssertEqual(UTIHelper.convertToMime(fileExtension: "txt"), "text/plain")
XCTAssertEqual(UTIHelper.convertToMime(fileExtension: "mp4"), "video/mp4")
}我试着打印UTType的信息,得到了以下信息:
print(utType.description)
print(utType.tags)
print(utType.preferredMIMEType)
com.apple.pkpass-data
[public.filename-extension: ["pkpass"]]
nil发布于 2021-08-05 09:27:27
您使用的UTType 初始化器的第二个参数的默认参数是.data。
init?(filenameExtension: String, conformingTo supertype: UTType = .data)因此,它找到了一个UTType,它是public.data的一个子类型。但是,您想要的UTType (com.apple.pkpass)没有将public.data作为超级类型(即不符合public.data)。实际上,.pkpass文件有点像.framework文件--它是一个包/包。(尝试使用Unarchiver提取其内容!)这就是初始化器找不到正确的UTType的原因。
了解有关UTType的这里的层次结构的更多信息。
您可以使用另一个首字母,并将nil传递给conformingTo参数。这将找到具有指定文件名的任何UTType:
let type = UTType(tag: "pkpass", tagClass: .filenameExtension, conformingTo: nil)
print(type.preferredMIMEType ?? "nil") // application/vnd.apple.pkpass还请注意文档中的警告:
不要试图仅基于文件扩展名派生文件系统对象的类型。
https://stackoverflow.com/questions/68663474
复制相似问题