谁说Sequoia不能用option+shift组合键?

(作者 Richard Jorne,转载请注明出处)

你是不是也喜欢用Option+Shift+各种其他键组合键?你是不是也喜欢用Xnip之类的软件?升级到macOS Sequoia之后,是不是再也用不了了?

前言

平时都用Option+Shift+4作为Xnip的唤起键,这样的话Cmd+Shift+4刚好对应的是系统的区域截图键,动的时候只用改一个键就好了,很方便。

升级到Sequoia之后突然发现Option+Shift的组合键不能用了,然而自己已经完全习惯了Option+Shift,于是打算找找办法。

本文给出了可能的原因与自己的实践给出的解决方案。 值得一提的是,这个解决方案不只适用于Xnip,理论上所有带有沙盒的App都可以通过这种办法解除限制。 只需将我提供的终端代码里的/Applications/Xnip.app替换为你的App的路径即可。

原因

这个答案告诉我们在Sequoia上苹果有意禁止了Option+Shift组合键,这里的讨论告诉我们这个限制只有在有沙盒的(仅上架App Store的App才需要)App中才有效。换句话说,只要你的App不是从App Store下载的,开发者就没必要开启沙盒,也就大概率可以继续使用这个组合键。

不幸的是,Xnip似乎只在App Store上发布。因此,要么开发者在未来发布非官方版,要么我们自己动手,丰衣足食。

解决方案

理论上,我们可以手动把带有沙盒的App解除沙盒。本文在经过阅读多篇文章后成功使Xnip解除Option+Shift限制。

也许你会觉得,我可以直接把解除限制之后的App发布,但经过尝试,似乎App与App Store的账户绑定,因此在其他设备上打开会遇到问题。我暂时没有找到很好的办法,因此请还是先自己动手。

请注意,该解决方案会丢失部分App的数据。 这是因为重新签名会导致App的BundleID改变,导致系统认为这个App是一个新的App,为这个App创建新的档案,因此有些数据会被创建为默认值。 实际上你的App原先的数据并没有被删除,因此当App的BundleID变回原来的时候,数据是会被恢复的。 说人话就是,如果你把重新签名后的App替换回开发者发布的版本,只要你不进行删除操作,理论上数据是会回来的。

技术细节

根据最新的尝试,只需要对App重新签名就可以去除App的所有entitlement,因此无需手动修改App二进制。然而,依然存在不成功的可能性,因此本文保留了手动修改的办法。

普通版

关闭程序

打开活动监视器,搜索Xnip,把所有能搜到的都关闭就好了。

运行命令

打开终端(Spotlight搜索Terminal) 随后输入

sudo codesign -d --force --verbose --deep --sign - /Applications/Xnip.app

然后回车。

-d--verbose代表输出详细内容,

--deep代表签名App的同时也签名中的所有Helper程序,这样你只需要操作一次。

--force多被写作-f,是一个意思。

--sign - 代表不使用证书来签名。

因为你用了sudo,以电脑管理员的权限运行,所以会要求你输入密码。正常输入即可,输入过程中是看不到密码的。输入完回车即可。 终端密码提示.png

如果遇到错误

终端错误提示.png

你大概率会遇到这个提示:

阻止提示.jpg

点击允许,会打开系统设置。随后,

https://s2.loli.net/2025/03/25/g9BGzqPoXmdcjls.png

只要把终端的开关打开,

https://s2.loli.net/2025/03/25/DyZw6jFgEnt3zLH.png

退出并重新打开即可。

随后,重新打开终端,然后从头按照上面步骤输入代码,回车,输入密码,回车,成功的结果就是这样。

终端签名成功.png

这个时候重新打开,理论上就可以直接使用了。

你还可以进一步检查一下沙盒是否已经去除: codesign -d --entitlements - /Applications/Xnip.app

% codesign -d --entitlements - /Applications/Xnip.app
# My output
Executable=/Applications/Xnip.app/Contents/MacOS/Xnip

只要看不到

[Dict]
	[Key] com.apple.security.app-sandbox
	[Value]
		[Bool] true
	...

的字眼就OK了。

下面是一个失败的例子(有沙盒): https://s2.loli.net/2025/03/25/Lcj19HG7uxDpniJ.png

如果成功,你大概App多半会弹出

https://s2.loli.net/2025/03/25/RbYCzqxUiul5LJj.png 允许就行。

理论上到这里就结束了。 如果上述操作依然不行,你可以尝试:

进阶版

基本上,我们需要做的事情就是:

  1. 把App中所有带有沙盒的二进制文件通过十六进制编辑器打开,把所有<key>com.apple.security.app-sandbox</key>属性从true变成fals并保存。你可能需要把文件保存到其他地方再通过Finder拖拽回去。
  2. 重新签名App与任何App的Helper
  3. 完成

接下来开始逐步教学:

true变false

下载好App,下载一个十六进制编辑器(推荐免费的Hex Fiend) 进入App目录下的文件夹(xxx.app/Contents/MacOS) 建议备份一下这个目录下的与App同名的二进制文件(名为Xnip的可执行文件),复制粘贴一下就好。 随后把这个二进制文件拖拽到其他地方(比如Downloads),因为你没法直接修改xxx.app/Contents/MacOS下的文件。 然后用Hex Fiend打开,选择“Text”,输入 <key>com.apple.security.app-sandbox</key> HexFiend1

然后搜索: HexFiend2 这个true就是我们要改的了。 接下来直接在右侧文本处删除true,改成fals就可以。记住是fals不是false尖括号保留。随后继续搜索,找到所有的<key>com.apple.security.app-sandbox</key>右侧紧贴着的<true/>,全部改为<fals/>。如果有的时候遇到<key>com.apple.security.app-sandbox</key>右侧没有<true/>的,就不用管了。 然后保存,用新的文件替换掉Xnip.app/Contents/MacOS中的二进制。 值得注意的是,你不仅要对Xnip的主程序进行修改,还需要对所有的Helper进行修改。只需要对(/Applications/Xnip.app/Contents/Library/LoginItems/)下的两个.app进行同样的操作即可。(如果是对于其他App,你需要找到所有的Helper全部进行修改)

这个时候你已经无法打开Xnip了。我们需要对它重新签名。

重新签名

执行命令

对于每个不同的.app文件(包括主程序和Helper,如 /Applications/Xnip.app/Contents/Library/LoginItems/ 下的应用)),你需要分别执行下面的命令,把/path/to/app更改为对应的.app文件位置即可。 这里要使用.app而不是二进制文件的位置。

还是可以用一样的代码:

sudo codesign -d --force --verbose --deep --sign - /Applications/Xnip.app

如果不行,你可以手动签名,只需要去掉--deep,也就是

sudo codesign -d --force --verbose --sign - /pathto/helper.app

/pathto/helper.app替换为对应的Helper位置即可。

之后应该就没有问题了。

Enjoy!

参考文章: Is there any way to disable sandbox https://stackoverflow.com/a/30449203/13478725 https://stackoverflow.com/a/27474942/13478725

仅允许跳转至本网站的链接引用。未经授权不得转载、复制或用于任何形式的商业或非商业用途。
使用 Hugo 构建
主题 StackJimmy 设计