【问题标题】:How to get All Extensions for UTType Image, Audio, and Video如何获取 UTType 图像、音频和视频的所有扩展
【发布时间】:2022-01-03 05:00:31
【问题描述】:

有没有办法将different UTType 扩展类型中的All 获取为字符串?我需要它们专门用于图像、音频和视频。

我关注了this answer,但它并没有给我所有的扩展名

var types = [String]()

let utiTypes = [kUTTypeImage, kUTTypeMovie, kUTTypeVideo, kUTTypeMP3, kUTTypeAudio, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG2Video, kUTTypeMPEG2TransportStream, kUTTypeMPEG4, kUTTypeMPEG4Audio, kUTTypeAppleProtectedMPEG4Audio, kUTTypeAppleProtectedMPEG4Video, kUTTypeAVIMovie, kUTTypeAudioInterchangeFileFormat, kUTTypeWaveformAudio, kUTTypeMIDIAudio, kUTTypeLivePhoto, kUTTypeTIFF, kUTTypeGIF, kUTTypeQuickTimeImage, kUTTypeAppleICNS]

for type in utiTypes {
            
    let str = String(type)
            
    guard let utiStr = fileExtension(for: str) else { continue }

    types.appent(utiStr)
}

dump(types)

结果是

15 elements // there are really 21 types
  - "jpeg"
  - "png"
  - "mov"
  - "mpg"
  - "m2v"
  - "ts"
  - "mp3"
  - "mp4"
  - "mp4"
  - "avi"
  - "aiff"
  - "wav"
  - "midi"
  - "tiff"
  - "gif"

这里的问题是它不返回像 qtjpg 这样的值。例如,我使用 UIDocumentPickerViewController,当我选择图像时,返回的 url pathExtension 是 jpg 而不是 jpeg。如果我想知道返回的 url 是否是一个图像,我将它的 pathExtension 与上面的 types 数组进行比较,它会说它没有出现在列表中。

【问题讨论】:

  • 我实际上无法在操场上重现您的输出。我什至没有得到“jpeg”或“png”。
  • @Sweeper 这很奇怪吗?你导入MobileCoreServices了吗?

标签: ios swift types uidocumentpickerviewcontroller mobilecoreservices


【解决方案1】:

你可以这样做:

import UniformTypeIdentifiers

let utiTypes = [UTType.image, .movie, .video, .mp3, .audio, .quickTimeMovie, .mpeg, .mpeg2Video, .mpeg2TransportStream, .mpeg4Movie, .mpeg4Audio, .appleProtectedMPEG4Audio, .appleProtectedMPEG4Video, .avi, .aiff, .wav, .midi, .livePhoto, .tiff, .gif, UTType("com.apple.quicktime-image"), .icns]

print(utiTypes.flatMap { $0?.tags[.filenameExtension] ?? [] })

当我在游乐场运行此代码时,您列出的 UTType 共有 33 个文件扩展名。请注意,您列出的某些 UTType 没有与之关联的文件扩展名,可能是因为它们太“通用”(例如“图像”和“视频”)。并且有些UTTypes有多个文件扩展名,有些可能与其他UTTypes的文件扩展名相同。

输出中没有“jpg”或“png”。要看到它们出现,您必须使用此列表:

// I've also removed the types that have no file name extensions
let utiTypes = [
    UTType.jpeg,
    .png,
    .mp3,
    .quickTimeMovie,
    .mpeg,
    .mpeg2Video,
    .mpeg2TransportStream,
    .mpeg4Movie,
    .mpeg4Audio,
    .appleProtectedMPEG4Audio,
    .avi,
    .aiff,
    .wav,
    .midi,
    .tiff,
    .gif,
    UTType("com.apple.quicktime-image"),
    .icns
]

使用上面的列表,我的输出是:

jpeg
jpg
jpe
png
mp3
mpga
mov
qt
mpg
mpeg
mpe
m75
m15
m2v
ts
mp4
mpg4
mp4
mpg4
m4p
avi
vfw
aiff
aif
wav
wave
bwf
midi
mid
smf
kar
tiff
tif
gif
qtif
qti
icns

另请注意,如果您想从文件扩展名中获取 UTType,您可以这样做:

let type = UTType(tag: "jpg", tagClass: .filenameExtension, conformingTo: nil)

并检查文件扩展名是否为例如通过这样做的图像:

type?.isSubtype(of: .image)

但请记住,文件不一定代表图像,因为它的名称说明它是 :)

【讨论】:

  • @LanceSamaria 我已经更新了一个 UTTypes 列表,它确实给了你“jpg”和“png”。
  • 感谢它的工作。关于你在回答中所说的。为什么不是文件扩展名为图像的图像?这也适用于 .movi​​e 吗?
  • 对于 iOS 14 UTTypes,有 UTType.movi​​e、UTType.video、UTType.audio、.rawVideo、.liveVideo。它是否仅仅因为它说视频和电影而适用于这些含义,并不意味着它是视频或电影?
  • @LanceSamaria 毕竟这只是一个文件名。无论文件的内容如何,​​我都可以将其更改为我想要的任何内容。我完全可以创建一个文本文件并将其命名为cat.png。基本上,我所说的与documentation here 中的警告相同。如果可能的话,您还应该使用其他一些指标来确定文件类型,否则您不能 100% 确定。
  • Ahhhhhh,你是 100% 正确的,我忽略了这一点。谢谢你的建议 :)!!!您是否有任何 SO 链接可供我用来检查实际内容本身?
【解决方案2】:

您不应尝试将 UIDocumentPickerViewController 返回的 URL 的扩展名与已知的扩展名列表进行比较。相反,使用url.resourceValues(forKeys: [.contentTypeKey]).contentType 为返回的URL 获取UTType,然后检查它是否符合.image:type.conforms(to: .image)

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多