iOS 检测键盘布局(例如 QWERTY、AZERTY)
iOS detect keyboard layout (e.g. QWERTY, AZERTY)
我正在 iOS 应用程序中构建自定义 suggestion/autocorrection 功能。它必须检测意外的相邻按键并将其与已知单词列表进行比较,以建议它认为用户打算键入的单词。
例如,如果自定义单词列表包含cat
、dog
、monkey
,并且用户类型为cst
,则应用可以确定最有可能单词是 cat
(因为 s
与 a
键相邻)
这将适用于标准 QWERTY keyboard,但如果用户使用 AZERTY 键盘会怎样?
为了 autocorrect/suggest 可靠地工作,应用程序必须能够检测到正在使用的键盘布局。
在iOS中,可以从UITextField
中获得UITextInputMode
对象。此对象有一个 primaryLanguage
(字符串)属性,它将显示语言环境(例如 en-GB
),但它不包含足够的粒度来区分 English (Australia) QWERTY
和 English (Australia) AZERTY
。在这两种情况下,primaryLanguage
都是 en-AU
。
是否可以检测 iOS 中的键盘布局?
我没能找到解决这个问题的完美方法。
也许这值得一张 TSI 门票与 Apple 员工讨论。
我知道这不会是一个令人满意的答案,但我仍然想在这里与未来的读者分享我的想法:
Private API of UITextInputMode:
textField.textInputMode?.value(forKey: "identifierWithLayouts")
这将 return 一个类似于 de_DE@sw=QWERTZ-German;hw=Automatic
的字符串,您可以从中推断出键盘布局。
用户默认值
UserDefaults.standard.object(forKey: "AppleKeyboards")
这将 return 用户已安装的所有键盘的列表。在大多数情况下,这只会是一种语言(表情符号键盘除外)。
例如:
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
的二进制编码。
我发现 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
我正在 iOS 应用程序中构建自定义 suggestion/autocorrection 功能。它必须检测意外的相邻按键并将其与已知单词列表进行比较,以建议它认为用户打算键入的单词。
例如,如果自定义单词列表包含cat
、dog
、monkey
,并且用户类型为cst
,则应用可以确定最有可能单词是 cat
(因为 s
与 a
键相邻)
这将适用于标准 QWERTY keyboard,但如果用户使用 AZERTY 键盘会怎样?
为了 autocorrect/suggest 可靠地工作,应用程序必须能够检测到正在使用的键盘布局。
在iOS中,可以从UITextField
中获得UITextInputMode
对象。此对象有一个 primaryLanguage
(字符串)属性,它将显示语言环境(例如 en-GB
),但它不包含足够的粒度来区分 English (Australia) QWERTY
和 English (Australia) AZERTY
。在这两种情况下,primaryLanguage
都是 en-AU
。
是否可以检测 iOS 中的键盘布局?
我没能找到解决这个问题的完美方法。 也许这值得一张 TSI 门票与 Apple 员工讨论。
我知道这不会是一个令人满意的答案,但我仍然想在这里与未来的读者分享我的想法:
Private API of UITextInputMode:
textField.textInputMode?.value(forKey: "identifierWithLayouts")
这将 return 一个类似于
de_DE@sw=QWERTZ-German;hw=Automatic
的字符串,您可以从中推断出键盘布局。用户默认值
UserDefaults.standard.object(forKey: "AppleKeyboards")
这将 return 用户已安装的所有键盘的列表。在大多数情况下,这只会是一种语言(表情符号键盘除外)。 例如:
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
的二进制编码。
我发现 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