【问题标题】:iOS15 UTType deprecations for URL-extension [duplicate]针对 URL 扩展的 iOS15 UTType 弃用
【发布时间】:2021-12-01 01:23:55
【问题描述】:

使用Swift5.5、iOS15.0.1,

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

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

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

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)
    }
}

【问题讨论】:

    标签: swift url ios15 swift-extensions uttype


    【解决方案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"
        }
    }
    

    【讨论】:

    • 谢谢Matt,你能用上面的具体实现举个例子吗?我不知道如何绕过弃用。
    • 不,我不建议为您编写代码。您的问题是如何停止弃用警告。阅读警告!它们会准确地告诉您在每种情况下应该做什么。
    • 好吧,我没想到你会重写所有内容。我根本不知道该怎么做。通常,我发现替换弃用代码更容易。但在这里,我一无所知。
    • 好吧,我举个例子,给你一个线索。
    • 您能否解释一下containsImagecontainsAudiocontainsVideo 等示例之一。我没有那么有经验去发现。在我看来,这一切都很神秘。感谢您的支持。
    【解决方案2】:

    我的初始 URL 扩展的 iOS15 兼容重写如下所示:

    import UniformTypeIdentifiers
    
    extension URL {
        func mimeType() -> String {
            let pathExtension = self.pathExtension
            if let type = UTType(filenameExtension: pathExtension) {
                if let mimetype = type.preferredMIMEType {
                    return mimetype as String
                }
            }
            return "application/octet-stream"
        }
        
        var containsImage: Bool {
            let mimeType = self.mimeType()
            if let type = UTType(mimeType: mimeType) {
                return type.conforms(to: .image)
            }
            return false
        }
        
        var containsAudio: Bool {
            let mimeType = self.mimeType()
            if let type = UTType(mimeType: mimeType) {
                return type.conforms(to: .audio)
            }
            return false
        }
        
        var containsMovie: Bool {
            let mimeType = self.mimeType()
            if let type = UTType(mimeType: mimeType) {
                return type.conforms(to: .movie)   // ex. .mp4-movies
            }
            return false
        }
        
        var containsVideo: Bool {
            let mimeType = self.mimeType()
            if let type = UTType(mimeType: mimeType) {
                return type.conforms(to: .video)
            }
            return false
        }
    }
    

    【讨论】:

      【解决方案3】:

      为了兼容 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"))
      

      【讨论】:

      • 谢谢匿名,感谢您的意见。它看起来像一个非常干净的解决方案。我一定会考虑的。
      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多