(作者 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
,以电脑管理员的权限运行,所以会要求你输入密码。正常输入即可,输入过程中是看不到密码的。输入完回车即可。
如果遇到错误
你大概率会遇到这个提示:
点击允许,会打开系统设置。随后,
只要把终端的开关打开,
退出并重新打开即可。
随后,重新打开终端,然后从头按照上面步骤输入代码,回车,输入密码,回车,成功的结果就是这样。
这个时候重新打开,理论上就可以直接使用了。
你还可以进一步检查一下沙盒是否已经去除:
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了。
下面是一个失败的例子(有沙盒):
如果成功,你大概App多半会弹出
允许就行。
理论上到这里就结束了。 如果上述操作依然不行,你可以尝试:
进阶版
基本上,我们需要做的事情就是:
- 把App中所有带有沙盒的二进制文件通过十六进制编辑器打开,把所有
<key>com.apple.security.app-sandbox</key>
属性从true
变成fals
并保存。你可能需要把文件保存到其他地方再通过Finder拖拽回去。 - 重新签名App与任何App的Helper
- 完成
接下来开始逐步教学:
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>
然后搜索:
这个
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