我现在正在用 Swift 编写键盘扩展,强烈建议不要这样做。 Swift 和键盘扩展 API 都是全新的,没有很好的文档记录,创建了显着的学习曲线,并且都有重要的错误或奇怪的实现细节需要解决。
从您提出问题的方式来看,您在 iOS 开发方面的经验并不丰富,并且尝试一次学习太多东西会导致灾难。如果我能完成我当前的项目,我会在 Objective C 中完成它,只是为了大大简化我正在学习的内容。
但好消息是您不需要键盘即可在其他应用程序中运行。这是个好消息,因为在您自己的应用程序中编写自定义输入键盘类非常简单易行,并且是一个很好的起点。有很多关于如何做到这一点的现有文档,包括这篇关于堆栈溢出的优秀文章。
How do I retrieve keystrokes from a custom keyboard on an iOS app?
更多细节:
cocoa 中的标准自定义输入视图 API 非常强大,键盘扩展中的 API 几乎完全中性,因此使用自定义输入视图比使用键盘扩展可以做更多的事情。要激活键盘扩展需要让用户在他们的 iPhone 设置中打开它,没有办法解决这个问题,也无法选择他们在您的应用程序中选择的键盘(除了根本不允许自定义键盘扩展)。
如果您出于任何原因(跟踪使用信息、激活应用内购买、访问偏好)需要访问互联网或应用内的数据,您还必须说服您的用户开启“完全访问”,这会显示令人难以置信的可怕警报向用户读取就好像打开它意味着您将能够监视他们并窃取他们的密码
回到为什么你不想在扩展中使用 Swift。首先,Objective C 不会导致 Xcode 的代码解析器一天崩溃很多次,而使用 Swift 开发会导致 Xcode 本身崩溃。在 Objective C 中,调试器几乎总是正确的,在当前版本的 Swift 中,你经常看不到数组或字典的内容,有时它显示的内容是不准确的,并且在单步执行代码时通常会采用无意义的路线。使用 Objective Code 开发意味着您不必因为 Objective C 本身的更改而更新您的代码,使用 Swift 几乎可以保证他们会在每个主要版本中进行重大的语法更改(9 月的最后一个版本)。
开发键盘扩展程序意味着有时您的扩展程序由于神秘原因无法加载,您需要花费数小时调试原因。我的 Swift 键盘扩展有时仅使用 println() 语句进行调试,因为我无法加载调试器。由于 Apple 的工具还不能很好地与键盘扩展一起使用,并且也不能很好地与 Swift 一起使用,因此将它们一起使用会成倍增加你的痛苦。
最终结果是,如果您不需要在自己的应用程序之外使用此键盘,那么使用键盘扩展 API 构建它是愚蠢的。如果您确实需要使用键盘扩展 API,那么在 Swift 中这样做是很愚蠢的。这是一个全职工作的傻瓜写的,试图发布一个基于 Swift 的键盘扩展。
如果你想使用标准的 cocoa 自定义输入视图 API,那么使用 Swift 可能就可以了。你仍然需要处理额外的问题,因为它是一门如此年轻的语言,但你不会浪费那么多天来试图弄清楚它们是否是由 Swift、键盘扩展 API、 Xcode 和它的调试器,或者你自己的错误。