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
相关产品推荐
相关产品推荐

