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

Posted

技术标签:

【中文标题】iOS 检测键盘布局(例如 QWERTY、AZERTY)【英文标题】:iOS detect keyboard layout (e.g. QWERTY, AZERTY) 【发布时间】:2020-07-29 15:42:12 【问题描述】:

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

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

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

要使自动更正/建议功能可靠地工作,应用必须能够检测到正在使用的键盘布局。

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

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

【问题讨论】:

【参考方案1】:

我还没有找到一个干净的解决方案来解决这个问题。 也许这值得一张 TSI 票与 Apple 员工讨论。

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

    Private API of UITextInputMode:

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

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

    用户默认值

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

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

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

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

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

【讨论】:

【参考方案2】:

我找到了this old question,它可能会为您提供解决方案。不确定它是否仍然有效,但它在问题中显示了如何获取当前安装的键盘,并且有人提供了“灰色区域”解决方案,因为似乎没有直接的方法可以实现您打算做的事情。 希望对您有所帮助。

【讨论】:

【参考方案3】:

索引 0 处的 AppleLanguages 对象是获取输入语言的常用方法。就我使用自定义键盘扩展而言,我没有尝试确定用户正在使用哪种语言和默认布局,而是使用了 Apple 推荐的一种方法:为每种语言使用单独的键盘布局。顺便说一句,我认为你不会有一个稳定和富有成效的预测,自动更正。至于自动更正,我使用 SymSpell (https://github.com/AmitBhavsarIphone/SymSpell) 和来自https://github.com/wolfgarbe/SymSpell/tree/master/SymSpell.FrequencyDictionary 的不同字典为每种语言制作我自己的 RealmDb。到目前为止,还需要做一些工作,但最终我的键盘扩展已在 App Store 中发布。 [注意:我与 SynSpell 所有者或编码者无关] 见图片

【讨论】:

以上是关于iOS 检测键盘布局(例如 QWERTY、AZERTY)的主要内容,如果未能解决你的问题,请参考以下文章

iOS/iPad Force Input 美式 QWERTY 键盘

vb.net 获取键盘布局

适用于 Windows 的 Mac 风格“Dvorak - Qwerty 命令”键盘映射?

如何使用 C# 更改单个键盘布局

密码字段的键盘仅在 iOS 12 上从 azerty 切换到 qwerty(有时)

在 WPF C# 中获取键盘布局