"Implement a Thumbnail Extension to allow the operating system and other apps to display thumbnails of your custom files."
운영체제 및 앱이 커스텀 파일의 썸네일을 표시하도록 하는 썸네일 확장을 구현합니다.
다른 앱이 커스텀 파일 타입의 썸네일을 생성할 수 있도록 QLThumbnailGenerator
객체를 사용해서 앱에 썸네일 확장을 추가할 수 있습니다. 또한, 이는 운영체제가 제너릭 파일 아이콘 대신 커스텀 파일 타입을 위한 풍부한 썸네일을 표시할 수 있도록 해줍니다. 예를 들어 썸네일 확장을 구현하면, iOS 파일 앱 및 macOS의 파인더는 사용자가 앱을 설치할 때 커스텀 파일 타입을 위한 썸네일을 표시합니다.
또한, 썸네일 확장 추가는 아이클라우드가 커스텀 파일과 함께 썸네일을 생성할 수 있도록 해줍니다. 이는 다른 기기가 아이클라우드에 싱크되었던 파일의 썸네일 표시를 가능하게 해줍니다.
앱에 썸네일 확장을 추가하려면, Xcode 프로젝트 네비게이터에서 프로젝트를 선택하고, 일반 창이 보여질 수 있도록 합니다. + 버튼을 선택하고 앱에 새로운 썸네일 확장을 추가합니다. Xcode가 확장을 위한 새 빌드 스킴을 생성하고 활성화할 수 있도록 해줘야 합니다.
썸네일 확장을 위한 새 스킴과 더불어 Xcode는 프로젝트에 아래 파일을 추가합니다.
QLThumbnailProvider
서브클래스입니다.Xcode는 NSExtensionAttributes
키 아래에 두 가지 중요한 엔트리를 포함하는 새 썸네일 확장을 위한 Info.plist를 생성합니다. Info.plist 파일에서 아래 엔트리를 업데이트하시기 바랍니다.
QLSupportedContentTypes
이 엔트리는 앱이 제공하고자 하는 썸네일이 적용될 모든 커스텀 파일 타입의 배열을 포함합니다. 정확한 유니폼 타입 아이덴티파이어(UTI)를 사용해서 지원하고자 하는 모든 파일 타입을 선언해야 합니다. UTI 목록이 파일 타입과 일치하는 경우 QuickLookThumbnailing
은 파일 타입을 위한 확장만을 사용합니다. 파일 타입이 따르는 것에 부모 UTI만을 리스트하는 것은 충분하지 않습니다.
QLThumbnailMinimumDimension
text-heavy 컨텐트와 같은 몇 가지 컨텐트 타입은 매우 작은 크기에서 좋은 표현을 나타내지 못할 것입니다. 이 엔트리의 값은 썸네일 확장이 제공하려는 썸네일의 최소 차원을 설명하며, 만약 앱 혹은 운영체제가 구체화된 크기보다 더 작은 썸네일을 요청하는 경우 QuickLookThumbnailing
프레임워크가 확장을 호출하는 것을 막도록 지시하면서 그렇게 됩니다. 대신 제너릭 파일 아이콘을 제공합니다.
Xcode의 썸네일 확장 템플릿은 프로젝트에 QLThumbnailProvider
의 서브클래스를 추가하며, 여기에는 비어있는 provideThumbnail(for:_:)
메소드가 포함되어 있습니다. 사용하길 원하는 QLThumbnailReply
의 이니셜라이저를 선택하고, 각 QLThumbnailRepresentation.RepresentationType
에 대한 썸네일 생성을 위해 구현을 추가하시기 바랍니다. 이 결정은 앱 및 앱의 요구사항에 따라 달라집니다. 썸네일을 생성하는 코드를 최적화해야 하고, 가능한 파일을 작게 유지해야 합니다.
override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) {
// There are three ways to provide a thumbnail through a QLThumbnailReply. Only one of them should be used.
// First way: Draw the thumbnail into the current context, set up with UIKit's coordinate system.
handler(QLThumbnailReply(contextSize: request.maximumSize, currentContextDrawing: { () -> Bool in
// Draw the thumbnail here.
// Return true if the thumbnail was successfully drawn inside this block.
return true
}), nil)
/*
// Second way: Draw the thumbnail into a context passed to your block, set up with Core Graphics's coordinate system.
handler(QLThumbnailReply(contextSize: request.maximumSize, drawing: { (context) -> Bool in
// Draw the thumbnail here.
// Return true if the thumbnail was successfully drawn inside this block.
return true
}), nil)
// Third way: Set an image file URL.
handler(QLThumbnailReply(imageFileURL: Bundle.main.url(forResource: "fileThumbnail", withExtension: "jpg")!), nil)
*/
}