在我的上篇文章《为啥Mac启动台图标删不掉?(老赖图标终极解决方案)》中提到,我无意中发现了MacOS启动台的配置数据,很巧的是这个数据并未加密,我很容易的就读出了其中的数据并对其进行了少量的改变,从而解决了图标总是去不掉的小问题。
从本期内容开始,我将围绕这个数据库,尝试开发一个小工具,通过可视化的方法对启动台的图标进行维护。
读前声明:我主业是Unity3D和C++,没有太多的脚本语言开发经验,对苹果生态的Swift语言也只有初步的了解。本内容将肉眼可见的存在大量野路子代码,希望各位多包涵,重点看看我的折腾过程和解决问题的思路。
闲话少说,让我们进入正题。
启动台包下的db数据库文件分析
可预期的启动台应用com.apple.dock.launchpad
包下的db数据库文件将是我们这个小工具的业务核心,因此在开始写代码前我们先分析分析这个数据到底是怎么组成的。
这里我将通过Mac下的SQLite数据库可视化管理工具:SQLiteStudio(本软件开源,感兴趣的可以点击软件名称进入Github页面下载) 直接连接数据进行分析。
我们可以很明显的注意到,启动台的这个数据库包含八张表,除掉与数据库配置相关的dbinfo表外,其余的七张表都将会在接下来的工作中发挥作用。
通过我初步画的数据库表结构,我们已经可以发现各表间的关系。这个数据库和常规的数据库很大的不同,主键都没有用UUID,而是用的自增长的整形数字。甚至在apps、categories等几张表中,直接用了items的主键作为自己的主键。
因为今天是初步启动这个项目,我们重点先关注影响启动台图标的三张表,即:items、apps和image_cahe。
其中items表是启动台上各个图标的主表,不论是文件夹groups还是应用apps都依赖这张表的rowid。而启动台图标的缓存图片则来自image_cache表,该表中包含图标大小以及图标png解码后的data数据。
给自己的项目添加SQLite的开源库
初步分析过数据库后,我们来试着写一个Mac程序来读取这个数据库的数据吧。
虽然MacOS的已经自带了SQLite3的命令行工具,很容易就可以通过调用终端,用指令的方式实现数据读取。但是作为一个想要快速迭代的工具,我第一时间还是选择在github上找找有没有开源的库可以使用。
很快我就发现了第一个Swift的SQLite库:SQLite.swift,就在我开心的下载的时候,release数据却给我泼了盆冷水:这个库的最新release已经是在2022年11月。再经过23年WWDC发布SwiftUI 5.0后,大概率这个库已经用不了了。
我不信邪的下载下来,不出所料,就是不能用了。但是很幸运的是,虽然这位叫stephencelis的老哥已经不再维护自己的项目了,却在这个项目的介绍下给我们推荐了几个类似的项目。
经过分析,我最后选择了GRDB项目(因为SQLiteDB没单独release的包要自己连接库,而Squeal的最后更新时间是17年,比SQLite.swift还老……)。
尝试读取数据库数据
成功import GRDB
后,我开始尝试读取启动台的配置数据库,此时一个很奇怪的报错却挡在了我面前。
因为我建的项目是MacOS的项目,当时我的逻辑依旧保持在Windows开发的那拖逻辑上,第一反应是/private/var/folders
下的文件是系统文件,普通APP没有读取权限。
在经过了多次的chmod
操作我始终都没有找到问题的解决方案,直到我看随手点到了项目配置文件里面,发现一个PC的程序居然是在沙盒下运行的,怪不得不能访问外部文件!
于是我开始尝试在沙盒配置里找到访问外部文件的方法,结果发现没有这个选项,只能开放下载、图片、音乐等少量的几个文件夹的访问权限。
就在我百思不得其解的时候,我发现整个沙盒配置脚步的左上角有一个垃圾筒图标,我试着把这个配置项删除,项目居然就运行正常了……
先做个简单的展示页
在绕了几个小时弯路之后,我终于实现了小工具的初步功能:读取启动台的配置数据库,并将其中的数据展示出来。
希望接下来能够一切顺利吧!
下个阶段做啥?
因为这个项目不算复杂,所以准备整个项目开源,等架子搭好后我会把正式项目上传github或者Gitee等平台,供大家查阅。
再说说这个小工具的几个重点功能吧:
图标删除:就像上篇文章提到的,删除无法删除的启动台图标是这个小工具最核心的功能。
多余的图片缓存清除:在梳理数据库的时候发现,即使图标已经不在启动台上展示了,但是在image_cache数据库中依旧保存了图片数据,将提供相关功能删除。
APP元数据供给:我发现不少Mac程序特别是操作系统层面的程序在配置上时不时需要提供其他APP的BundleId等信息,我通过这个小工具把能提供的数据都通过可视化的方法提供给各位。
如果各位还有什么好想法,也可和我说呀~