iOS определить раскладку клавиатуры (например, QWERTY, AZERTY) - PullRequest
4 голосов
/ 16 апреля 2020

Я создаю функцию пользовательского предложения / автокоррекции в приложении iOS. Он должен обнаружить случайные смежные нажатия клавиш и сравнить его со списком известных слов, чтобы предложить слово, которое, по его мнению, пользователь хотел напечатать.

Например, если список пользовательских слов содержит cat, dog, monkey, и пользователь вводит cst, приложение может определить, что наиболее вероятное слово было cat (поскольку s находится рядом с клавишей a)

QWERTY keyboard showing cst

Это будет работать на стандартной QWERTY-клавиатуре , но что произойдет, если пользователь использует клавиатуру AZERTY?

enter image description here

Чтобы автозамена / предложить работать надежно, приложение должно быть в состоянии обнаружить используемую раскладку клавиатуры.

В iOS можно получить UITextInputMode объект из UITextField. Этот объект имеет свойство primaryLanguage (string), которое будет отображать локаль (например, en-GB), но в ней недостаточно зернистости, чтобы различать guish между English (Australia) QWERTY и English (Australia) AZERTY. В обоих случаях primaryLanguage - это en-AU.

Можно ли определить раскладку клавиатуры в iOS?

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Мне не удалось найти чистое решение этой проблемы. Возможно, это будет стоить билета TSI, чтобы обсудить это с сотрудниками Apple.

Я знаю, что это не будет удовлетворительным ответом, но я все же хотел бы поделиться своими мыслями здесь для будущих читателей:

  1. Частный API UITextInputMode :

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

    Это вернет строку, подобную de_DE@sw=QWERTZ-German;hw=Automatic, из которой вы можете вывести клавиатуру layout.

  2. UserDefaults

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

    Это вернет список всех клавиатур, которые установил пользователь. В большинстве случаев это будет только один язык (кроме клавиатуры Emoji). Например:

    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 голосов
/ 28 апреля 2020

Объект AppleLanguages ​​с индексом 0 является распространенным способом получения языка ввода. Вместо того, чтобы пытаться определить, какой язык используют пользователи и расположение по умолчанию, поскольку я работал с пользовательским расширением клавиатуры, я использовал один из рекомендуемых Apple способов: использовать отдельную раскладку клавиатуры для каждого языка. Другими словами, я не думаю, что у вас будет стабильный и продуктивный прогноз, кстати, с автокоррекцией. Что касается автокоррекции, я использовал 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

0 голосов
/ 24 апреля 2020

Я нашел этот старый вопрос , который может найти решение для вас. Не уверен, что он все еще работает, но он показывает в вопросе, как получить текущие установленные клавиатуры, и кто-то предложил решение «серой области», так как кажется, что нет прямого способа достичь того, что вы намереваетесь сделать. Надеюсь, что это поможет.

...