QLThumbnailGenerator saveBestRepresentation 内容类型错误 Swift iOS 13+
QLThumbnailGenerator saveBestRepresentation wrong content type Swift iOS 13+
在完成一项任务时,我偶然发现了一个 iOS 13+ API 可以解决我的问题 - https://developer.apple.com/documentation/quicklookthumbnailing/creating_quick_look_thumbnails_to_preview_files_in_your_app
它按预期工作,但为了完成我的任务,我需要将创建的缩略图保存到磁盘,我正在尝试使用 - https://developer.apple.com/documentation/quicklookthumbnailing/qlthumbnailgenerator/3237298-savebestrepresentation
func saveBestRepresentation(for request: QLThumbnailGenerator.Request,
to fileURL: URL,
contentType: String,
completion completionHandler: @escaping (Error?) -> Void)
这是我的代码:
/// Uses quick look to asynchronously create best possible thumbnail image at path
static func createThumbnailFor(_ inputUrl: URL, at outputUrl: URL) {
let size: CGSize = CGSize(width: 60, height: 90)
let scale = UIScreen.main.scale
// Create the thumbnail request.
let request =
QLThumbnailGenerator.Request(
fileAt: inputUrl,
size: size,
scale: scale,
representationTypes: .all)
// Retrieve the singleton instance of the thumbnail generator and generate the thumbnails.
let generator = QLThumbnailGenerator.shared
generator.saveBestRepresentation(for: request, to: outputUrl, contentType: "image/jpg") { (error) in
if let error = error {
print(error.localizedDescription)
}
}
}
我收到以下错误:
2020-07-28 13:08:01.259835+0300 SomeAppName[4748:1236635] *** Terminating app due to uncaught exception 'QLThumbnailGeneratorInvalidContentType', reason: 'image/jpg is not a supported image type'
我尝试了很多不同的类型并查看了 headers,但它只说 'The content type of the thumbnail image that you want to save. Use a type that is supported by CGImageDestination
, such as kUTTypePNG
or kUTTypeJPEG
.'。不幸的是 kUTTypePNG
和 kUTTypeJPEG
都被弃用了。在这种情况下应该使用哪种内容类型?
"public.png" 适合我。
MIME 类型(例如“image/jpg”)和 UTI(例如“public.jpeg”)是两种不同的东西。 Apple API 通常采用 UTI,包括您尝试使用的 UTI。像 kUTTypeJPEG 这样的符号只是常量字符串的名称。如果您愿意,可以使用字符串文字代替符号名称。
一些常见的例子:
"public.jpeg" (kUTTypeJPEG)
"public.png" (kUTTypePNG)
"com.compuserve.gif" (kUTTypeGIF)
"public.tiff" (kUTTypeTIFF)
"public.heic" (no symbolic name defined)
为了好玩,“com.microsoft.bmp”(kUTTypeBMP)怎么样
如果您知道 MIME 类型,您可以像这样获取 UTI:
uti = UTTypeCreatePreferredIdentifierForTag( kUTTagClassMIMEType, mimeType, (CFStringRef)0);
如果你知道 UTI,你可以像这样得到 MIME 类型:
mimeType = UTTypeCopyPreferredTagWithClass( uti, kUTTagClassMIMEType);
如果您想要在您的案例中可以使用的 UTI 列表,您可以:
CFArrayRef utis = CGImageDestinationCopyTypeIdentifiers();
(这些都是 C 代码片段。Swift 可能略有不同。)
iOS14方式:
在文件的顶部,import UniformTypeIdentifiers
。现在改变
contentType: "image/jpg"
至
contentType: UTType.jpeg.identifier
在完成一项任务时,我偶然发现了一个 iOS 13+ API 可以解决我的问题 - https://developer.apple.com/documentation/quicklookthumbnailing/creating_quick_look_thumbnails_to_preview_files_in_your_app
它按预期工作,但为了完成我的任务,我需要将创建的缩略图保存到磁盘,我正在尝试使用 - https://developer.apple.com/documentation/quicklookthumbnailing/qlthumbnailgenerator/3237298-savebestrepresentation
func saveBestRepresentation(for request: QLThumbnailGenerator.Request,
to fileURL: URL,
contentType: String,
completion completionHandler: @escaping (Error?) -> Void)
这是我的代码:
/// Uses quick look to asynchronously create best possible thumbnail image at path
static func createThumbnailFor(_ inputUrl: URL, at outputUrl: URL) {
let size: CGSize = CGSize(width: 60, height: 90)
let scale = UIScreen.main.scale
// Create the thumbnail request.
let request =
QLThumbnailGenerator.Request(
fileAt: inputUrl,
size: size,
scale: scale,
representationTypes: .all)
// Retrieve the singleton instance of the thumbnail generator and generate the thumbnails.
let generator = QLThumbnailGenerator.shared
generator.saveBestRepresentation(for: request, to: outputUrl, contentType: "image/jpg") { (error) in
if let error = error {
print(error.localizedDescription)
}
}
}
我收到以下错误:
2020-07-28 13:08:01.259835+0300 SomeAppName[4748:1236635] *** Terminating app due to uncaught exception 'QLThumbnailGeneratorInvalidContentType', reason: 'image/jpg is not a supported image type'
我尝试了很多不同的类型并查看了 headers,但它只说 'The content type of the thumbnail image that you want to save. Use a type that is supported by CGImageDestination
, such as kUTTypePNG
or kUTTypeJPEG
.'。不幸的是 kUTTypePNG
和 kUTTypeJPEG
都被弃用了。在这种情况下应该使用哪种内容类型?
"public.png" 适合我。
MIME 类型(例如“image/jpg”)和 UTI(例如“public.jpeg”)是两种不同的东西。 Apple API 通常采用 UTI,包括您尝试使用的 UTI。像 kUTTypeJPEG 这样的符号只是常量字符串的名称。如果您愿意,可以使用字符串文字代替符号名称。
一些常见的例子:
"public.jpeg" (kUTTypeJPEG)
"public.png" (kUTTypePNG)
"com.compuserve.gif" (kUTTypeGIF)
"public.tiff" (kUTTypeTIFF)
"public.heic" (no symbolic name defined)
为了好玩,“com.microsoft.bmp”(kUTTypeBMP)怎么样
如果您知道 MIME 类型,您可以像这样获取 UTI:
uti = UTTypeCreatePreferredIdentifierForTag( kUTTagClassMIMEType, mimeType, (CFStringRef)0);
如果你知道 UTI,你可以像这样得到 MIME 类型:
mimeType = UTTypeCopyPreferredTagWithClass( uti, kUTTagClassMIMEType);
如果您想要在您的案例中可以使用的 UTI 列表,您可以:
CFArrayRef utis = CGImageDestinationCopyTypeIdentifiers();
(这些都是 C 代码片段。Swift 可能略有不同。)
iOS14方式:
在文件的顶部,import UniformTypeIdentifiers
。现在改变
contentType: "image/jpg"
至
contentType: UTType.jpeg.identifier