Swift 使用 InputMethodKit 写输入法

如何在 iOS 上写一款输入法?这个问题已经被很多人解答过了。你可以轻易通过 Google 找到一篇详细的教程。但是,在 macOS 上写一款输入法就没那么简单了。

好吧,严格来讲,是指用 Swift 在 macOS 上写一款输入法很难。主要的原因是 从来没有人做过这件事情 。

目前能够获取的资料,除了苹果官方的 API 说明(一点用也没有),以及官方的 demo(很详细但过时了,而且还是用 OC 写的。)之外,几乎什么都没有了。

现在我写这篇文章就是来总结一下,如果你想用 Swift 3 开始写一个 macOS 能用的输入法,需要绕过哪些坑。

Info.plist

对于输入法来说,需要在这个文件当中做一些额外的配置,大部分的配置你只需要对比苹果官方推出的 Demo 即可 —— 它们大部分都是正确的。

有一点没有说明的地方在于,你的 Bundle identifier 需要按照一定的格式来写——也就是说,这个字段中必须包含 inputmethod 这个关键词。

比如说,我的输入法叫这个名字 LogInputMac ,那么我就不能写成 com.logcg.LogInputMac ,这样的话 macOS 就不能把它识别为输入法(就算放进了 /资源库/Input Methods/ 也不行),你必须把 inputmethod 这个关键字加进去,而且最好不要放在最后,应该放在前三个点(.)之内。比如说像我这样: com.logcg.inputmethod.LogInputMac 。

另外,对于 Swift,你还需要做一下单独的操作,如果你就这样将编译好的 APP 放进 /资源库/Input Methods/ ,那么虽然 macOS 可以识别输入法,但实际上不会有任何作用——你的 IMKInputController 是完全不会被加载的。

这是因为 macOS 找不到你的 IMKInputController 类,为此,我们应该把 InputMethodServerControllerClass 和 InputMethodServerDelegateClass 字段的内容改成以 $(PRODUCT_MODULE_NAME). 前缀的形式,也就是说,应该写成这样:

Use Swift working with InputMethodKit
Use Swift working with InputMethodKit

AppDelegate.swift

由于 InputMethodKit 的运作方式与普通 APP 不同,我们需要在应用一开始就初始化 IMKServer 类,大多数人的第一反应就是把它放到 applicationDidFinishLaunching(_ : ) 里去执行,正相反,由于 Swift 没有 main 函数,我们可以直接把它声明为全局变量而不需要先声明再给全局变量赋值:

Print(_:)

由于 Swift 不像 OC 都是用 NSLog 来输出控制台消息,大家都还是喜欢用 Print(_:) 来实现打印终端内容——对于输入法来说,你不能这样调试程序了。

如果你直接用 Xcode 执行你的输入法,是没有任何效果的。想要测试输入法,就必须将它放到 /资源库/Input Methods/ 中然后加载。这样的话,即使你使用 Xcode attach 到输入法的进程,也不会得到任何终端输出。

这时候就需要使用 NSLog ,它可以方便地将输入法的消息输出到控制台中,这样你就可以打开控制台,然后查看进程的信息了。

延伸阅读

最后,这里放上唯一一篇我能找到的中文的对  InputMethodKit 介绍的文章,大家可以参考一下(很遗憾,我并没有用到这篇文章,因为找到它的时候我已经踩过了以上所有的坑)。

另外,我想你可能还是无法成功的对照 OC 代码来转换 Swift 项目,那么我把这个对应苹果官方“NumberInput_IMKit_Sample-NumberInput_0”的 Swift 项目打包上传,如果需要的话可以下载参考

anyShare分享到:

“Swift 使用 InputMethodKit 写输入法”的一个回复

  1. Hello there I am so happy I found your weblog, I really found you by accident, while I
    was looking on Aol for something else, Anyhow I
    am here now and wokuld just like to say thanks
    a lot for a remarkable post and a all round exciting blog (I also love the theme/design),
    I don’t have time to broiwse it all at the momernt but I
    have saved it and also added your RSS feeds, so when I have time I will be back tto read more, Please do
    keep up the superb job.

发表评论

电子邮件地址不会被公开。 必填项已用*标注