QuickLook服务

111 阅读2分钟

简介

QuickLook是Mac10.5引用的一项新特性,允许在Finder中快速预览多种不同类型的文件。不需要打开文件,只需要按下空格键就可以通过QuickLook快速预览文件内容。QuickLook采用的是可扩展的架构,使得大部分的工作都由插件完成。这些插件的后缀为.qlgenerator的bundle,只要将bundle文件拖放在QuickLook目录下就可以完成插件的安装(系统范围的QuickLook目录为/System/Libaray/QuickLook,针对个人的QuickLook目录为~/Libaray/QuickLook)。

实际的插件是一个特效编译的程序--但不是一个独立的可执行程序。插件程序没有传统的main()入口点。而是实现了QuickLookGeneratorPluginFactory入口点。另外还有一个配置文件负责将插件和对应的文件类型关联起来,文件类型通过苹果的UTI表示,也就是逆DNS表示法。举个例子:

在我电脑~/Libaray/QuickLook目录下面有一个SogouSkinFileQuickLook.glgenerator文件,查看其可执行文件的Load command。是没有LC_MAIN(设置程序主线程入口地址和栈大小)命令的.

quicklookd是系统的“QuickLook”服务器,是通过/System/Libaray/LaunchAgents/com.apple.quicklook.plist文件在登录中启动的。这个后台服务程序本身就在QuickLook框架中,其程序路径在

/System/Library/Frameworks/QuickLook.framework/Versions/A/Resources/quicklookd.app。

qlmanage命令是管理QuickLook服务的,这条命令的使用输出如下:

qlmanage命令

qlmanage允许您测试Quick Look生成器和管理Quick Look服务器。

#重置Quick Look服务器和所有Quick Look客户端的生成器缓存
qlmanage -r 

#获取Quick Look服务器上的所有信息,包括检测到的生成器列表。
qlmanage -m [name...]

#显示为指定文件生成的Quick Look缩略图(如果可用)。
qlmanage -t [-x] [-i] [-s size] [-f factor] [-c contentTypeUTI [-g generator]] [file ...]

#显示Quick Look为指定文件生成的预览。
qlmanage -p [-x] [-c contentTypeUTI [-g generator]] [file ...]

#显示帮助。
qlmanage -h

实际开发中的应用

使用QuickLookUI库中的QLPreviewPannel实现图片预览


/*
 图片预览
 */
var previewPanel: QLPreviewPanel!
func didClickPreview(_ imgPath: String) {        
        self.imgPath = imgPath
        if self.previewPanel != nil {
            self.previewPanel.updateController()
        }else{
            self.previewPanel = QLPreviewPanel.shared()
        }
        self.previewPanel.delegate = self
        self.previewPanel.dataSource = self
        self.previewPanel.makeKeyAndOrderFront(self)
    }

func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
    return 1
}
    
func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
    if self.imgPath == nil {
        self.imgPath = ""
    }
    let lastPath = (self.imgPath! as NSString).lastPathComponent
    let path = GlobelInfo.getInstance().imageCachePath + String(format: "%@",lastPath);
    
    let fileMangaer = FileManager.default
    if fileMangaer.fileExists(atPath: "/" + self.imgPath!) {
        return URL.init(fileURLWithPath: "/" + self.imgPath!) as QLPreviewItem
    }else {
        return URL.init(fileURLWithPath: path) as QLPreviewItem
    }
}
    
    override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
        return true
    }
    
    override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
        panel.delegate = self
        panel.dataSource = self
    }
    
    override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
        panel.dataSource = nil;
        panel.delegate = nil;
    }