iOS 检测键盘布局(例如 QWERTY、AZERTY)

iOS detect keyboard layout (e.g. QWERTY, AZERTY)

我正在 iOS 应用程序中构建自定义 suggestion/autocorrection 功能。它必须检测意外的相邻按键并将其与已知单词列表进行比较,以建议它认为用户打算键入的单词。

例如,如果自定义单词列表包含catdogmonkey,并且用户类型为cst,则应用可以确定最有可能单词是 cat(因为 sa 键相邻)

这将适用于标准 QWERTY keyboard,但如果用户使用 AZERTY 键盘会怎样?

为了 autocorrect/suggest 可靠地工作,应用程序必须能够检测到正在使用的键盘布局。

在iOS中,可以从UITextField中获得UITextInputMode对象。此对象有一个 primaryLanguage(字符串)属性,它将显示语言环境(例如 en-GB),但它不包含足够的粒度来区分 English (Australia) QWERTYEnglish (Australia) AZERTY。在这两种情况下,primaryLanguage 都是 en-AU

是否可以检测 iOS 中的键盘布局?

我没能找到解决这个问题的完美方法。 也许这值得一张 TSI 门票与 Apple 员工讨论。

我知道这不会是一个令人满意的答案,但我仍然想在这里与未来的读者分享我的想法:

  1. Private API of UITextInputMode:

    textField.textInputMode?.value(forKey: "identifierWithLayouts")

    这将 return 一个类似于 de_DE@sw=QWERTZ-German;hw=Automatic 的字符串,您可以从中推断出键盘布局。

  2. 用户默认值

    UserDefaults.standard.object(forKey: "AppleKeyboards")

    这将 return 用户已安装的所有键盘的列表。在大多数情况下,这只会是一种语言(表情符号键盘除外)。 例如:

    Optional(<__NSCFArray 0x600003b8e6c0>(en_US@sw=QWERTY;hw=Automatic,emoji@sw=Emoji))

    您还可以遍历 UserDefaults.standard.dictionaryRepresentation() 并在值中搜索 QWERTZ/QWERTY/AZERTY。

  3. 通过大量的手动操作,您也许可以在所有模棱两可的情况下将 UITextInputModes 编码为二进制数据,例如 en_AU。就像是 NSKeyedArchiver.archivedData(withRootObject:textField.textInputMode, requiringSecureCoding: false) 可用于在运行时比较用户 textInputMode 的二进制编码。

我发现 this old question 可能有适合您的解决方案。不确定它是否仍在工作,但它在问题中显示了如何获取当前安装的键盘,并且有人提供了 "gray area" 解决方案,因为似乎没有直接的方法可以实现您打算做的事情。 希望对您有所帮助。

索引 0 处的 AppleLanguages 对象是获取输入语言的常用方法。就我使用自定义键盘扩展而言,我没有尝试确定用户使用的语言和默认布局,而是使用了 Apple 推荐的一种方法:为每种语言使用单独的键盘布局。换句话说,我不认为你会有一个稳定和富有成效的预测,顺便说一句,自动更正。至于自动更正,我使用了 SymSpell (https://github.com/AmitBhavsarIphone/SymSpell) and different dictionaries from https://github.com/wolfgarbe/SymSpell/tree/master/SymSpell.FrequencyDictionary to make my own RealmDb for each language. So far it was a little work to do, but finally my keyboard extension was publisehd in App Store. [Note: I am not related with SynSpell owners or coders] See images