安全输入已开启:Comoji 图标上的锁是什么意思
Comoji 为 Mac 上的每一个应用免费加入 Slack 风格的 :emoji: 自动补全。
如果你是因为输入 :fire 突然没有反应才打开 Comoji 的菜单,而第一行写着安全输入已开启,菜单栏图标上还有一把小挂锁,那么这一页就是给你的解释。简单来说:macOS 有意停止了向 Comoji 传递按键,而 Comoji 选择告诉你这件事,而不是默默待在那里。大多数时候,这把锁会在几秒内自行解除。偶尔它会卡住,卡住时有一个办法一定管用:退出登录你的 Mac,再重新登录。详细内容见下文。有一点要先说清楚,因为挂锁就挂在我们的图标上:这不是 Comoji 的 bug,而是 Apple 安全文本输入的 bug。Comoji 只是报告这个状态,它既不会导致这个状态,也无法解除它。

什么是安全输入
安全输入(Apple 也称之为“安全键盘输入”或 secure event input)是 macOS 窗口服务器的一种模式。开启期间,按键只会发送给请求它的那个应用,其他任何软件都收不到。系统上所有的键盘事件监听都会安静下来:表情自动补全、文本扩展工具、剪贴板管理器、按键重映射工具、读屏软件的输入回显,统统如此。正是这个机制保证了你在 Safari 里输入的密码不会被其他任何软件看到,这是一个好设计。
密码框获得焦点时,应用会开启它;焦点离开时再关闭。锁定屏幕在你解锁期间会开启它。“终端”和 iTerm2 都有一个安全键盘输入菜单项,只要那个窗口在最前面,它就会一直保持开启。密码管理器会在解锁提示前后开启它。
为什么 Comoji 要为此显示一把锁
Comoji 的工作方式是监听一个冒号加几个字母,然后在光标处给出补全建议。安全输入开启时,负责监听的部分什么都收不到,所以无论你输入什么,弹窗都不会出现。在这个版本之前,这种沉默和 Comoji 坏了、在当前应用中被停用、或者缺少权限看起来一模一样,于是大家很自然地会重启应用、重新授予权限,或者写信来问。现在,只要安全输入处于开启状态,图标上就会带一个挂锁标记,菜单最上方的项目会写明是哪个应用持有它,让这个状态一目了然,而不再神秘。
这个标记也提醒了 Comoji 一直有意为之的一件事:它从不在密码框里进行补全。早在有这个标记之前就是如此。除了系统层面的阻断之外,Comoji 还会检查获得焦点的输入框是否为安全文本框,如果是就不介入。这把锁并不是行为上的变化,只是让你能看到的东西变了。
正常情况:锁来了又走
在浏览器里点进一个密码框,看看菜单栏:挂锁出现了。点进用户名框或页面正文,它又消失了。打开启用了“安全键盘输入”的“终端”,锁会一直在,直到你切换到其他应用或关闭这个选项。在这些情况下都没有任何问题,菜单项只是告诉你是哪个应用在负责,应用一释放,Comoji 立刻恢复工作。
卡住的情况:锁一直不解除
有时候,你在一个再普通不过的输入框里打字,锁却一直在;或者菜单显示安全输入被一个你早已退出的应用持有;又或者在你解锁屏幕几分钟后,显示由 loginwindow 持有。这就是安全输入卡住了,这是 macOS 的 bug,Comoji 和菜单里提到的那个应用都无法从外部撤销。
Comoji 没有任何办法开启安全输入,而且任何应用(包括 Comoji)都无法替另一个应用关闭它。所有监听键盘的软件会在同一时刻安静下来,Comoji 只是那个告诉你的人。
问题出在这里:窗口服务器为每个进程维护一个计数。应用每开启一次安全输入,计数加一;每关闭一次,计数减一;直到所有应用的计数都归零,会话才会退出安全模式。如果某个应用开启的次数多于关闭的次数,或者在计数仍为正数时退出,整个登录会话就会一直被锁住。我们亲眼见过 Chrome 在恢复包含密码框的标签页后这样做,也见过锁定屏幕在最近的某个 macOS 版本上这样做:每次解锁开启安全输入好几次,却只关闭一次。其他应用无法降低不属于自己的计数。这正是安全保障在按设计运作,也正因为如此,计数一旦泄漏才会这么棘手。
如何解除,从最省事的开始
- 查看 Comoji 菜单中安全输入已开启下方的应用名称(或将指针悬停在菜单栏图标上)。如果是浏览器,就在该浏览器里点进一个普通文本框,或者切换标签页。很多时候仅此一步就能释放。
- 如果是“终端”或 iTerm2,打开该应用自己的菜单,关闭安全键盘输入。
- 用
Command-Q完全退出菜单中提到的应用,然后重新打开。如果它退出时计数仍为正数,锁可能依然存在;那就继续下一步。 - 如果菜单显示持有者已经退出,或者在屏幕未锁定时显示 loginwindow,请从苹果菜单中退出登录,然后重新登录。退出登录会结束持有泄漏计数的会话;重新启动也可以,只是更慢。在此期间尽量不要锁定屏幕,因为每次锁定和解锁都可能再次泄漏。
你可以在操作前后用“终端”确认状态。第一条命令会打印会话记录的持有者进程号,第二条命令会把这个数字转换成进程名:
ioreg -l -w 0 | grep -o '"kCGSSessionSecureInputPID"=[0-9]*'
ps -p <that number> -o comm=如果第一条命令没有任何输出,说明安全输入已关闭,Comoji 又能收到按键了。如果得到的数字属于一个 ps 找不到的进程,那就是最典型的卡住情况。
一定管用的办法:退出登录再重新登录
上面的每一步都是有时管用的捷径。退出登录则是一定管用的那一个,因为泄漏的计数存在于你的登录会话中,而退出登录会结束这个会话。保存好你的工作,从苹果菜单中选择退出登录,重新登录,锁就消失了;Comoji 会随登录项一起启动并立即响应。我们经历了一次卡住的 Chrome、一次卡住的锁定屏幕,又折腾了一整个上午才得出这个结论,所以如果锁在导致它的应用退出后仍然存在,请直接跳到这一步。完全重新启动效果相同,只是更费时间。
对此 Comoji 能做什么、不能做什么
Comoji 每秒查询一次这个标志,这种查询的开销小到无法测量;它查找持有者进程的方式和 ioreg 一样。它无法关闭安全输入,如果能的话,那将是一个严重的安全问题。在锁存在期间,它也看不到你输入的任何内容,这正是这种模式的意义所在。它能做的,是不让这种沉默看起来像故障,并把需要你去处理的应用名称告诉你。
如果你好奇 Comoji 如何使用它持有的两项权限,安全页面公开了全部网络访问面以及确保这一点的测试。功能页面上的安全输入检测是本文的简短版本;同一页面还介绍了按应用和按网站的关闭开关,它们和这把锁是两回事:那些开关由你决定,而这把锁属于 macOS。
一个标记,一行菜单,系统出问题时再退出登录一次。Comoji 宁愿直白地告诉你,也不想让你错怪了对象。
常见问题
为什么 Comoji 在菜单栏显示一个锁图标?
挂锁表示 macOS 安全输入已开启,按键只会发送给请求它的应用,Comoji 看不到这些按键。当密码框或锁定屏幕获得焦点,或者“终端”启用了“安全键盘输入”时,它就会出现;该应用一释放,它就会消失。“安全输入已开启”菜单项会写明是哪个应用造成的。
如何在 Mac 上关闭安全键盘输入?
在“终端”或 iTerm2 中,打开应用菜单,取消勾选“安全键盘输入”。如果是浏览器或密码管理器,点进一个非密码输入框,或者退出该应用。如果造成问题的应用已经退出,这个设置仍然保持开启,请退出登录 macOS 再重新登录,这会重置持有泄漏状态的会话。
为什么我退出应用后安全输入还是卡住了?
macOS 窗口服务器会为每个进程记录安全输入请求的计数,如果某个应用在计数仍为正数时退出,会话就会一直被锁住,而且谁都无法释放。已知 Chrome 在恢复含有密码框的标签页后,以及某些 macOS 版本上的锁定屏幕,都会出现这种情况。退出登录再重新登录即可解除。
Comoji 能在密码框中使用吗?
不能,这是有意的设计。密码框获得焦点时,macOS 会阻断所有键盘监听,而且 Comoji 还会独立检查获得焦点的输入框是否为安全文本框,如果是就不介入。锁形标记只是让这个系统状态变得可见,免得安静的弹窗被误认为应用坏了。
免费下载 Comoji Mac 版
Slack 和 Discord 风格的 :emoji: 自动补全,在 Mac 上随处可用。免费。