如何在 Mac 上导出整段 iMessage 对话
“信息”应用为什么没有导出命令、哪些免费方法确实可行、如何取得从未同步到 Mac 的历史,以及如何得到一个多年后仍能打开的相册。
· 1 min read
macOS 上的“信息”应用没有导出命令,从来都没有。搜索这个问题,排在最前面的是 Apple 支持社区的帖子和一条 Reddit 帖子——这本身就说明了内置选项把这件事解决得有多好。
下面是真正可行的做法。
对话存放在哪里
在 Mac 上,“信息”把所有内容存放在 ~/Library/Messages/chat.db 这个 SQLite 数据库里,附件在 ~/Library/Messages/Attachments/。macOS 会保护这两者:没有在“系统设置”中获得完全磁盘访问权限的 App 都读不了它们,而且该文件夹在访达中默认是隐藏的。
由此可以推出两点,而这两点解释了围绕这个话题的大部分困惑:
- 任何导出你消息的工具都需要完全磁盘访问权限。 这件事本身不是危险信号,而是 macOS 唯一允许的方式。真正要紧的是,工具读取了这个文件之后拿它做什么。
- 这个数据库是 Apple 未公开的内部实现细节。 它的结构会随 macOS 版本变化,且不作预告。这正是导出工具需要更新的原因,也是导出的相册绝不该采用 Apple 格式的原因。
方法一:打印成 PDF(免费、系统自带、有局限)
- 打开“信息”,选中对话。
- 按住 Command + 上箭头 滚动到对话最顶部,直到不再加载更早的消息。
- 文件 › 打印,然后 PDF › 存储为 PDF。
这行得通,对短对话来说就是正确答案。两个实实在在的限制:你必须靠滚动把整段对话加载出来,面对好几年的历史会很痛苦;而且 PDF 装不下可播放的视频或音频。
方法二:自己查询数据库(免费、偏技术)
由于 chat.db 是标准的 SQLite 文件,你可以直接查询它。先给终端授予完全磁盘访问权限,然后:
sqlite3 ~/Library/Messages/chat.db
有三个坑,手工做的人常常会踩:
- 时间戳不是 Unix 时间。 “信息”存的是自 2001-01-01 起的纳秒数,所以你需要
datetime(message.date/1000000000 + 978307200, 'unixepoch')。 text经常是 NULL。 较新的消息把内容放在attributedBody里,那是一段序列化的 Apple typedstream,而不是普通的text列。正确解码它才是整个问题里最难的部分;把这段二进制想当然地当成 UTF-16 处理,会得到一堆看起来几乎正确的乱码。- 以只读方式打开。 使用
file:...?mode=ro,这样一条随手写的查询永远不可能写入你正在使用的“信息”数据库。
如果你希望这条路被认真走完而不是手工凑合,imessage-exporter 免费、开源,并且能正确解码 typedstream。
方法三:导出成一个相册(大多数人真正想要的)
大多数人想要的结果,是一个可以留存的文件夹:完整的对话,不需要专门软件就能阅读,照片和视频都完好。
这意味着导出需要产出:
- 双方的每一条消息,按顺序排列,带时间戳。
- 每一个附件都以原始质量拷贝出来,而不是被缩放塞进某个文档里。
- 一种不依赖生成它的工具的格式。普通的 HTML、JSON 和 Markdown 都符合,私有数据库不符合。
属于这一类的工具有 imessage-exporter、iMazing、Decipher TextMessage,以及做了这个网站的 Message Album。Message Album 特别看重的正是最后一点:导出结果是一个自成一体的离线网站,不使用框架、CDN、外部字体或服务器,另外附带一份 SHA-256 校验和清单——其出发点是,你要保存的东西不应该因为某个依赖消失了就不能用了。
取得从未同步到 Mac 的历史
这是大多数教程会跳过的一步,也常常是导出结果不完整的原因。
你的 Mac 只拥有同步到它上面的消息。如果这段对话在你拥有这台 Mac 之前就开始了,或者“信息”的 iCloud 同步把较旧的附件卸载走了,那么从 Mac 自己的资料库导出就会悄悄漏掉东西。
解决办法是改从 iPhone 备份导出:
- 连接 iPhone 或 iPad,打开访达。
- 在边栏中选中该设备。
- 选择立即备份。加密和未加密的备份都包含“信息”。如果你还想要“健康”等受保护的数据,请勾选给本地备份加密。
- 把你的导出工具指向那份备份,而不是 Mac 的资料库。
备份里装的是手机上的内容,而这通常比抵达 Mac 的要多。
怎么判断一次导出是否完整
对你使用的任何工具只问一个问题:当某样东西缺失时,它会怎么做?
从未下载到本地的附件,以及无法解码的 Apple 私有消息内容,这两种情况都很正常。会把它们报告为明确警告的工具,让你知道自己手上有什么。悄悄丢掉它们的工具,则留给你一个看起来完整、实际并不完整的相册——而你要等到某天去找某张具体照片时才会发现。
也要核对数量。如果一个工具会告诉你它从源头读取了多少条消息、向输出写入了多少条,那这两个数字应当吻合,或者差异应当有说明。
之后该拿这个相册怎么办
只存在于一个地方的相册不算保存好了,只能算暂放。把它复制到别处:一块外置硬盘、另一台机器,或者你选择的云存储。因为一次好的导出就是一个装着普通文件的普通文件夹,所以这件事不过是复制一个文件夹。
如果你的导出包含校验和,请把清单一起保留。五年之后,它是唯一能让你确认眼前这份副本仍然完好的东西。