MacOS输入法 - inputmethodkit 的activateServer和deactivateServer 调用时机问题

543 阅读1分钟

背景及问题

输入法需要在输入框(IMKTextInput)切换时做一些清理工作,比如说清理之前未输入原码,关闭候选框

可以通过了类重写(override) IMKInputController上deactivateServeractivateServer两个方法

这两个方法会在从一个输入框(IMKTextInput)切换到另一个输入框(IMKTextInput)时自动调用

业火五笔输入法中,有一个保持应用最后输入模式的功能,会在deactivateServer时,缓存当前的输入模式和当前的输入框所发属的应用,以便于在再次切到该应用时,重新设置回原来的输入模式

但是在实际运行时,发现在某些场景下,切换回原应用时,发现并没有切换到原输入模式

原因分析

打开控制台,查看输出日志后发现,在某些场景下activateServer会先执行,然后再执行deactivateServer, 所以导致记录到的输入模式并不是之前应用下的输入模式,因此导致了上述问题

查看Apple文档发现,关于deactivateServeractivateServer的调用顺序,文档中并没有说明,不得不再吐槽一下Apple的开发文档

解决问题

因为deactivateServeractivateServer的调用顺序并不能得到保证,所以只能修改实现,把清理和缓存的工作放在activateServer中,最终问题解决