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
    }

测试通过 txtmp4 类型,但未通过 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.