Swift: 无法从文件扩展名 .pkpass 获取 MIME 类型形式的 UTType
Swift: Can not get mime type form UTType from file extension .pkpass
我正在编写一种从给定文件扩展名获取 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
您使用的 UTType
initialiser 的第二个参数的默认参数是 .data
:
init?(filenameExtension: String, conformingTo supertype: UTType = .data)
所以这找到了 UTType
,它是 public.data
的子类型。但是,您想要的 UTType
(com.apple.pkpass
) 没有 public.data
作为超类型(即不符合 public.data
)。事实上,.pkpass
文件有点像 .framework
文件 - 它是 bundle/package 的东西。 (尝试使用 The Unarchiver 提取其内容!)这就是初始化程序找不到正确 UTType
.
的原因
了解有关 UTType
层级结构的更多信息 here。
您可以使用 this other initialiser,并将 nil
传递给 conformingTo
参数。这将为您找到具有指定文件名的任何 UTType
:
let type = UTType(tag: "pkpass", tagClass: .filenameExtension, conformingTo: nil)
print(type.preferredMIMEType ?? "nil") // application/vnd.apple.pkpass
另请注意文档中的警告:
Don’t attempt to derive the type of a file system object based solely on its filename extension.
我正在编写一种从给定文件扩展名获取 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
您使用的 UTType
initialiser 的第二个参数的默认参数是 .data
:
init?(filenameExtension: String, conformingTo supertype: UTType = .data)
所以这找到了 UTType
,它是 public.data
的子类型。但是,您想要的 UTType
(com.apple.pkpass
) 没有 public.data
作为超类型(即不符合 public.data
)。事实上,.pkpass
文件有点像 .framework
文件 - 它是 bundle/package 的东西。 (尝试使用 The Unarchiver 提取其内容!)这就是初始化程序找不到正确 UTType
.
了解有关 UTType
层级结构的更多信息 here。
您可以使用 this other initialiser,并将 nil
传递给 conformingTo
参数。这将为您找到具有指定文件名的任何 UTType
:
let type = UTType(tag: "pkpass", tagClass: .filenameExtension, conformingTo: nil)
print(type.preferredMIMEType ?? "nil") // application/vnd.apple.pkpass
另请注意文档中的警告:
Don’t attempt to derive the type of a file system object based solely on its filename extension.