Damn MacOS App Sandbox|Devlog · 10

发布于:09/08/2025 14:40:23 · Programming · #devlog · #solar-network

Intro

首先,什么是 Discord RPC?

Snipaste_2025-09-08_20-55-19.png

如上图,这个 Playing 显示的就是 RPC 的结果,这个 RPC 不是 Reproducable Remote Calls,而是 Discord Rich Presence(我不知道 C 是哪里来的)

RPC 需要应用主动介入,比如 osu!laser,会有一些额外的显示(比如正在打什么铺面),像上图的结果很可能是 Discord 通过扫描线程发现的,而不是 RPC 的结果。

Apple

那么,这个东西跟苹果有什么关系呢?好问题!这主要是因为 Discord RPC 的通信方式。虽然他们提供一个网络端口(本地启动的 WebSocket 服务器),但是大部份还是使用 Pipe 来通信,不知道为什么。

Pipe 文件的位置位于系统临时目录的 discord-rpc-0(这后面的数字会根据占用情况改变),这在 Linux 系统上工作良好,Windows 系统有别的路径,也没什么问题。但是到了 macOS 事情就不对了。

上文说这个相关的东西被放在系统的临时目录中,所以理所当然的我们需要获取系统的临时目录,但是如果你的 App 启用了 App Sandbox(如果你要上架 macOS App Store 这项是必须的)。这里获取的路径会很奇怪:

Platform.enviornment["TMPDIR"]
/Users/littlesheep/Library/Containers/dev.solsynth.solian/Data

echo $TMPDIR
/var/folders/yy/_mpw1wl52715jsr0vn28_6vc0000gn/T

可以看到代码获取到的是在 Sandbox 容器中的路径,而且你以为他是 Symbol link 吗?太天真了,就是一个单纯的,隔离的文件夹,所以说,在启用了 Sandbox 的 macOS 应用中几乎是不可能读取到系统的目录的。除非用户选择的文件、一些系统目录(文档,图片等)

现在理解了为什么有些公司有 Apple Developer Program 也不上 App Store 了。

Discord

当然,这不能全怪苹果,苹果的 Sandbox 机制的初衷是好的,让 macOS 的恶意软件少之又少。这个 Discord 也是人才选这么个偏僻的路径做 IPC 的文件路径,强烈批判。

而且大部份 Discord RPC 客户端的 fallback 机制不完善,大部份都只处理了 IPC 的访问,没有 WebSocket 的,照例来讲 WebSocket 的兼容性更完善应该更被广泛使用才对。

The Way Out

你指望我找到什么神秘的私有接口解决这个问题吗?没有,我的解决方法非常简单,逃避;逃避可耻但有用,在 macOS 上把 IPC 关掉就好了 :catNerd: 反正没什么人在 macOS 上玩游戏对吧…… 实在不行扫个线程好了 :catNerd: