【问题标题】:Swift: Can not get mime type form UTType from file extension .pkpassSwift:无法从文件扩展名 .pkpass 中获取 MIME 类型表单 UTType
【发布时间】:2021-08-05 08:56:10
【问题描述】:

我正在编写一种从给定文件扩展名中获取 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

【问题讨论】:

    标签: swift simulator ios14 uttype


    【解决方案1】:

    您正在使用的UTType initialiser 的第二个参数的默认参数是.data

    init?(filenameExtension: String, conformingTo supertype: UTType = .data)
    

    所以这会找到一个UTType,它是public.data 的子类型。但是,您想要的 UTType (com.apple.pkpass) 没有 public.data 作为超类型(即不符合 public.data)。事实上,.pkpass 文件有点像.framework 文件——它是一个包/包。 (尝试使用 Unarchiver 提取其内容!)这就是初始化程序找不到正确 UTType 的原因。

    详细了解UTTypes here 的层次结构。

    您可以使用this other initialiser,并将nil 传递给conformingTo 参数。这将为您找到任何具有指定文件名的UTType

    let type = UTType(tag: "pkpass", tagClass: .filenameExtension, conformingTo: nil)
    print(type.preferredMIMEType ?? "nil") // application/vnd.apple.pkpass
    

    还要注意文档中的警告:

    不要试图仅根据文件扩展名来推导文件系统对象的类型。

    【讨论】:

    • thx @sweeper,您的回答还解决了将 mime 转换为文件扩展名时的类似问题。
    猜你喜欢
    • 2010-11-05
    • 2015-06-13
    • 2013-09-11
    • 2014-06-14
    • 2013-11-10
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多