实战问题
使用 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