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

5
我正在开发一款iOS应用程序中的自定义建议/自动更正功能。它必须检测到意外相邻按键,并将其与已知单词列表进行比较,以建议用户打算输入的单词。
例如,如果自定义单词列表包含catdogmonkey,而用户输入cst,则应用程序可以确定最可能的单词是cat(因为s键与a键相邻)。

QWERTY keyboard showing cst

这将适用于标准的QWERTY键盘,但如果用户使用的是AZERTY键盘会发生什么?

enter image description here

为了使自动更正/建议可靠地工作,应用程序必须能够检测正在使用的键盘布局。
在iOS中,可以从UITextField获取UITextInputMode对象。此对象具有primaryLanguage(字符串)属性,它将显示语言环境(例如en-GB),但这不包含足够的细粒度来区分英语(澳大利亚)QWERTY英语(澳大利亚)AZERTY。在这两种情况下,primaryLanguage都是en-AU
在iOS中是否可能检测键盘布局?
3个回答

1
我无法找到一个干净的解决方案来解决这个问题。 也许值得提交一个TSI票据与苹果员工讨论一下。
我知道这不是一个令人满意的答案,但我仍然想在这里分享我的想法,供未来读者参考。
  1. UITextInputMode的私有API

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

    这将返回一个字符串,例如de_DE@sw=QWERTZ-German;hw=Automatic,您可以从中推断出键盘布局。

  2. UserDefaults

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

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

    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的二进制编码。


0

我找到了这个旧问题,它可能对你有解决方案。不确定它是否仍然有效,但在问题中展示了如何获取当前安装的键盘,并且有人提供了一个“灰色地带”的解决方案,因为似乎没有直接的方法来实现你想要做的事情。 希望这可以帮到你。


0

AppleLanguages对象在索引0处是获取输入语言的常见方式。与其尝试确定用户使用的语言和默认布局,就我使用自定义键盘扩展的经验而言,我使用了苹果推荐的一种方法:为每种语言使用单独的键盘布局。否则,我认为您将无法获得稳定且高效的预测和自动更正功能。至于自动更正,我使用了SymSpell(https://github.com/AmitBhavsarIphone/SymSpell)和来自https://github.com/wolfgarbe/SymSpell/tree/master/SymSpell.FrequencyDictionary的不同字典,为每种语言制作了自己的RealmDb。到目前为止,这需要一些工作,但最终我的键盘扩展已发布在App Store中。[注意:我与SynSpell所有者或编码人员无关]请参见图片enter image description here

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接