iOS15 问题大全之 URL 扩展的 iOS15 UTType 弃用 如何解决 iOS15 UTType deprecations for URL-extension

实战问题

使用 Swift5.5、iOS15.0.1、

从 iOS15 开始,我意识到与我现有的 URL 扩展相关的一些弃用正在进行中。

我没有找到关于如何重写现有扩展的任何好的文档。

这是我目前的大约实施。我不知道如何规避使用 iOS15 的 16 个折旧警告。对此的任何想法都非常感谢!

extension URL {
    func mimeType() -> String {
        let pathExtension = self.pathExtension
        if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue() {
            if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
                return mimetype as String
            }
        }
        return "application/octet-stream"
    }

    var containsImage: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
            return false
        }
        return UTTypeConformsTo(uti, kUTTypeImage)
    }

    var containsAudio: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
            return false
        }
        return UTTypeConformsTo(uti, kUTTypeAudio)
    }

    var containsVideo: Bool {
        let mimeType = self.mimeType()
        guard  let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
            return false
        }
        return UTTypeConformsTo(uti, kUTTypeMovie)
    }
}

解决方案

答案1

所有 kUTType… 常量和全局 C 函数都被 UTType 结构替换。 https://developer.apple.com/documentation/uniformtypeidentifiers/uttype

就这样import UniformTypeIdentifiers你就走了。

这是将文件扩展名转换为 mime 类型的简单示例:

let ext = "txt"
if let type = UTType(filenameExtension: ext) {
// or: if let type = UTType(tag: ext, tagClass: .filenameExtension, conformingTo:nil) {
    if let mime = type.preferredMIMEType {
        print(mime) // "text/plain"
    }
}

答案2

为了与 iOS 15 及更早版本兼容以获得正确的 UUType,因为 kUTType 已被弃用,您可以使用此代码

var UTTypeID : Array = [ "url", "data", "plainText"]

 // iOS 15 Deprecated kUTType, use UTType
func UTTypeCompat(strID : String) -> String
{
    //0 - URL, 1 - Data, 2 - PlainText
    let indexUTType:Int? = UTTypeID.firstIndex(of: strID)

    if #available(iOS 15.0, *)
    {
        switch indexUTType {
        case 0:
            return UTType.url.identifier
        case 1:
            return UTType.data.identifier
        case 2:
            return UTType.plainText.identifier
        default:
            NSLog("Unsupported UUtype: \(strID)")
            break
        }
    }
    else
    {
        switch indexUTType {
        case 0:
            return kUTTypeURL as String
        case 1:
            return kUTTypeData as String
        case 2:
            return kUTTypePlainText as String
        default:
            NSLog("Unsupported UUtype: \(strID)")
            break
        }
    }
    // throw Exception
    return "Err"
}

以及如何为任何版本的 iOS 获取标识符的示例

    NSLog(UTTypeCompat(strID: "url"))
    NSLog(UTTypeCompat(strID: "data"))
    NSLog(UTTypeCompat(strID: "plainText"))

精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复