You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS15中URL扩展使用的UTType相关API废弃问题如何解决?

iOS15下URL扩展UTI相关API适配方案

适配说明

iOS15开始苹果正式废弃CoreServices框架下的C风格UTI操作接口,全部迁移到UniformTypeIdentifiers框架下的原生SwiftUTType结构体API,替换后可完全消除所有废弃警告,且无需手动管理CF对象内存,避免内存泄漏风险。

适配后代码(支持iOS14+,兼容iOS15及以上版本)

import UniformTypeIdentifiers

extension URL {
    func mimeType() -> String {
        guard let uti = UTType(filenameExtension: pathExtension) else {
            return "application/octet-stream"
        }
        return uti.preferredMIMEType ?? "application/octet-stream"
    }
    
    var containsImage: Bool {
        guard let mimeType = mimeType(), let uti = UTType(mimeType: mimeType) else {
            return false
        }
        return uti.conforms(to: .image)
    }
    
    var containsAudio: Bool {
        guard let mimeType = mimeType(), let uti = UTType(mimeType: mimeType) else {
            return false
        }
        return uti.conforms(to: .audio)
    }
    
    var containsVideo: Bool {
        guard let mimeType = mimeType(), let uti = UTType(mimeType: mimeType) else {
            return uti.conforms(to: .movie)
        }
        return false
    }
}

兼容更低iOS13及以下版本代码

如果项目需要支持iOS14以下系统版本,可添加版本判断兼容新旧两套实现:

import UniformTypeIdentifiers
import CoreServices

extension URL {
    func mimeType() -> String {
        if #available(iOS 14.0, *) {
            guard let uti = UTType(filenameExtension: pathExtension) else {
                return "application/octet-stream"
            }
            return uti.preferredMIMEType ?? "application/octet-stream"
        } else {
            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 {
        if #available(iOS 14.0, *) {
            guard let mimeType = mimeType(), let uti = UTType(mimeType: mimeType) else {
                return false
            }
            return uti.conforms(to: .image)
        } else {
            let mimeType = mimeType()
            guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
                return false
            }
            return UTTypeConformsTo(uti, kUTTypeImage)
        }
    }
    
    var containsAudio: Bool {
        if #available(iOS 14.0, *) {
            guard let mimeType = mimeType(), let uti = UTType(mimeType: mimeType) else {
                return false
            }
            return uti.conforms(to: .audio)
        } else {
            let mimeType = mimeType()
            guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
                return false
            }
            return UTTypeConformsTo(uti, kUTTypeAudio)
        }
    }
    
    var containsVideo: Bool {
        if #available(iOS 14.0, *) {
            guard let mimeType = mimeType(), let uti = UTType(mimeType: mimeType) else {
                return false
            }
            return uti.conforms(to: .movie)
        } else {
            let mimeType = mimeType()
            guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
                return false
            }
            return UTTypeConformsTo(uti, kUTTypeMovie)
        }
    }
}

内容的提问来源于stack exchange,提问作者iKK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:18:02