Почему клавиатура на телефоне сама сворачивается
Перейти к содержимому

Почему клавиатура на телефоне сама сворачивается

  • автор:

Gboard на Android вылетает. Что делать

Несмотря на то что Google Play уступает App Store по выручке от продажи приложений, для Android софт играет более важную роль, чем для iOS. Сказывается чрезвычайно никудышная политика обновления смартфонов на базе ОС от Google, которые в лучшем случае получат две новых версии, а то и не получат ни одной. Из этого проистекает потребность компенсировать отсутствие новых функций приложениями, которые бы восполняли пробел. По большому счёту все от этого только выигрывают, но иногда всё портят баги, которые время от времени дают о себе знать.

Gboard на Android вылетает. Что делать. Gboard — пожалуй, была бы лучшей клавиатурой для Android. Если бы не баги. Фото.

Gboard — пожалуй, была бы лучшей клавиатурой для Android. Если бы не баги

Читайте также: Популярная клавиатура для Android ворует деньги пользователей

Пользователи Android начали жаловаться на самопроизвольные вылеты клавиатуры Gboard. По их словам, это может произойти когда угодно, вне зависимости от того, используется клавиатура в данный момент или нет. Просто на экране смартфона неожиданно появляется сообщение об ошибке, которая привела к завершению работы Gboard, а всё, что остаётся сделать пользователю, — только согласиться и нажать «ОК». Правда, так повезло далеко не всем. Если у одних вылеты случаются лишь время от времени, у других клавиатура не запускается в принципе, оповещая о некоем сбое при любой попытке открыть её.

Почему вылетает Gboard

Если верить сообщению на официальном форуме поддержки Google, в компании уже исправили проблему в последнем обновлении. Но поскольку распространение апдейтов для приложений поискового гиганта обычно в разных странах происходит с небольшими перерывами, некоторые пользователи всё ещё не могут обновить клавиатуру и решить возникшую проблему. Впрочем, и для них есть способ временно устранить сбой путём удаления накопившегося кэша и дождаться обновления, спокойно используя Gboard без каких-либо неурядиц.

«Нам известно, что небольшой процент пользователей Android 7.1 и более ранних версий ОС столкнулся со сбоями клавиатуры Gboard. Исправление этой проблемы, включённое в состав последнего обновления, уже выпущено. Для большинства пользователей обновление пройдёт незаметно, при условии, что у них включён механизм автообновления. В противном случае может потребоваться принудительная перезагрузка затронутого устройства. Только так можно будет гарантировать, что изменения, содержащиеся в обновлении, вступили в силу», — пояснили в Google.

Клавиатура Google не работает. Как исправить

  • Перейдите в «Настройки» и откройте раздел «Приложения;
  • Найдите в списке установленных приложений Gboard и откройте его страницу;

Клавиатура Google не работает. Как исправить. Gboard вылетает. Что делать. Фото.

Gboard вылетает. Что делать

  • В открывшемся окне перейдите во вкладку «Память», а затем нажмите «Очистить кэш».

Несмотря на то что, скорее всего, объём кэшированных файлов составляет от 20 до 150 КБ, их удаление приведёт Gboard в чувство. После этого программа должна начать работать так же стабильно, как и раньше, не разочаровывая вас периодическими вылетами. Тем не менее, пренебрегать обновлением, которое выпустила Google, не стоит, даже если самопроизвольные завершения работы клавиатуры прекратились полностью. Не исключено, что после того как кэш накопится снова, проблема опять себя проявит, и тогда вам придётся либо на постоянной основе чистить «засор», либо просто смириться с вылетами.

Оставить комментарий в Telegram. Поделитесь мнением в чате читателей Androidinsider.ru

Теги

  • Компания Google
  • Обновления Android
  • Операционная система Android

Наши соцсети

Новости, статьи и анонсы публикаций

Что делать, если не работает клавиатура на Android. Собрали все способы решения проблемы

Смартфон — универсальное средство общения и поиска информации. При реализации этих задач незаменимым инструментом является виртуальная клавиатура для Андроид. По умолчанию она уже должна быть установлена на вашем устройстве. Чтобы вызвать ее, достаточно тапнуть по строке вода в любом приложении, будь то мессенджер или веб-браузер, после чего можно смело набирать текст. Однако у некоторых людей не появляется клавиатура даже на полностью исправном смартфоне. С чем может быть связана подобная проблема, и как ее решить? В этом мы и постараемся разобраться.

Что делать, если не работает клавиатура на Android. Собрали все способы решения проблемы. Если у вас не отображается клавиатура, вы пришли по адресу. Фото.

Если у вас не отображается клавиатура, вы пришли по адресу

Не появляется клавиатура — что делать

Первым делом предлагаю определить, в чем именно заключается проблема. Итак, когда вы нажимаете на строку ввода, вместо клавиатуры на экране появляется голосовой ассистент Google, или же область вовсе остается пустой. Возможно, ошибка связана с устаревшей начинкой смартфона, которая заставляет его долго думать, прежде чем он выведет средство ввода на экран. Но чаще всего ключ к решению проблемы скрывается в настройках устройства.

⚡ Подпишись на Androidinsider в Пульс Mail.ru, чтобы получать новости из мира Андроид первым

Через настройки телефона можно изменить клавиатуру, а еще одно неловкое нажатие приведет к полному отключению средства ввода. Тогда его придется активировать повторно, действуя по следующей инструкции:

  1. Откройте настройки телефона.
  2. Перейдите в «Расширенные настройки», а затем — «Язык и ввод».
  3. Откройте вкладку «Управление клавиатурами».
  4. Нажмите кнопку включения напротив понравившегося средства ввода.

Не появляется клавиатура — что делать. Если вы не можете найти раздел «Язык и ввод», воспользуйтесь поиском внутри настроек. Фото.

Если вы не можете найти раздел «Язык и ввод», воспользуйтесь поиском внутри настроек

Если все сделано верно, то в следующий раз, когда вы тапните по строке ввода, на экране появится выбранная ранее клавиатура. Как правило, на этом проблема становится исчерпана, но иногда даже рассмотренная выше инструкция не помогает исправить ошибку, и тогда приходится искать новый способ ее решения.

�� Загляни в телеграм-канал Сундук Али-Бабы, где мы собрали лучшие товары с АлиЭкспресс

Не работает клавиатура на телефоне

Если вы проверили настройки устройства и убедились, что в качестве основного средства ввода выбрана правильная клавиатура, но она все равно не появляется, возможно, проблема заключается в самом приложении, отвечающем за работу инструмента набора текста. С целью устранения ошибки вы можете прибегнуть к нескольким манипуляциям, но для начала сделайте следующее:

  1. Откройте настройки смартфона.
  2. Перейдите в раздел «Приложения».
  3. Выберите программу, которую вы используете для ввода текста.

Не работает клавиатура на телефоне. Если приложения нет в списке, попробуйте найти его через Google Play. Фото.

Если приложения нет в списке, попробуйте найти его через Google Play

Открыв настройки приложения, вы можете очистить его память, после чего параметры клавиатуры будут возвращены к исходному состоянию. Более радикальная мера — переустановка программы после предварительного удаления. Далее вам останется еще раз убедиться, что в разделе настроек «Язык и ввод» выбран именно тот инструмент набора текста, которым вы планируете пользоваться.

❗ Поделись своим мнением или задай вопрос в нашем телеграм-чате

Если проблема касается стандартной клавиатуры Gboard, то у вас могут возникнуть проблемы с ее поиском в разделе «Приложения» настроек своего телефона. Однако программа продолжит оставаться доступной в магазине Google Play. Поэтому посетите его, откройте страницу Gboard и нажмите кнопку «Удалить». Это действие приведет не к удалению приложения, а к очистке его обновлений, которые могли стать причиной появления ошибки. Затем не забудьте вновь проверить настройки языка и ввода, чтобы убедиться в правильности выбранной клавиатуры.

Как изменить клавиатуру на телефоне

Если после всех предпринятых действий у вас все равно не появляется клавиатура, можно попробовать воспользоваться другим средством ввода, то есть установить стороннее приложение. Ранее мы подробно рассказывали о самых популярных программах, которые могут рассматриваться в качестве инструмента для набора текста. А сейчас остановимся на том, как скачать клавиатуру на Андроид и установить ее:

  1. Запустите Google Play или любой другой магазин приложений.
  2. При помощи поисковой строки найдите понравившуюся клавиатуру.
  3. Нажмите кнопку «Установить».

Как изменить клавиатуру на телефоне. Установить клавиатуру не составит труда, но ее еще нужно настроить. Фото.

Установить клавиатуру не составит труда, но ее еще нужно настроить

Как ни странно, после установки приложение не будет работать в качестве основного средства ввода. Все эти параметры вам придется настраивать самостоятельно, действуя по инструкции:

  1. Перейдите в раздел «Язык и ввод» настроек телефона.
  2. Откройте вкладку «Управление клавиатурами».
  3. Включите понравившееся средство ввода.
  4. Вернитесь на шаг назад и во вкладке «Текущая клавиатура» выберите нужный вариант.

Как изменить клавиатуру на телефоне. После включения новую клавиатуру нужно выбрать в качестве основного средства ввода. Фото.

После включения новую клавиатуру нужно выбрать в качестве основного средства ввода

Теперь при нажатии на строку ввода смартфон будет показывать новую клавиатуру, и необходимость в использовании старой программы отпадет сама собой.

⚡ Подпишись на Androidinsider в Дзене, где мы публикуем эксклюзивные материалы

Почему еще не работает клавиатура на Андроиде

В заключение рассмотрим еще один сценарий появления неполадок, когда не появляется клавиатура на Андроид только в отдельных приложениях (например, в браузере), а в остальных продолжает работать. Такая проблема напрямую связана с ошибкой программы, где не отображается инструмент ввода текста. В ее решении помогают следующие советы:

  • очистка кэша и данных приложений;
  • обновление или переустановка программы;
  • откат на старую версию приложения.

Воспользуйтесь одним из предложенных вариантов, а если и ничего не поможет, то постарайтесь связаться с разработчиками приложения и подробно опишите свою ситуацию. Сделать это можно в том числе на странице программы в Google Play и любом другом маркете.

Оставить комментарий в Telegram. Поделитесь мнением в чате читателей Androidinsider.ru

Теги

  • Новичкам в Android

Наши соцсети

Новости, статьи и анонсы публикаций

Свободное общение и обсуждение материалов

Вылетает/сворачивается клавиатура google на андроид.

Пару часов назад обнаружил такую штуку, до этого такого никогда не было.
Пока я пишу в вк/телеграмме/не всегда, но в поисковике/вообще в мессенджерах, то моя клавиатура работает некоторое время и после него сворачивается.
После этого я вполне свободно могу ее открыть, но она снова будет закрываться через какое-то время.
Перезагружать телефон пробовал, переустанавливать клавиатуру тоже, скачивать другую клавиатуру тоже, кеш/файлы все пробовал чистить, без толку.
Пробовал гуглить, ничего не вышло. Возможно неправильно гуглил.
Вот, спрашиваю тут.
Кто-нибудь знает как это исправить?

Дополнен 4 года назад
не вылетает только если использовать «режим закрепления»
Голосование за лучший ответ

//некоторое время и после него сворачивается// —удалите и заново скачайте_установите GBoard [← ссылка] далее в Настройках настройте под себя и затем в Настройках Батареи проверьте Gboard (не стоит л экономия энергия, сворачивать в N-время?)

OegwipariЗнаток (306) 4 года назад
Как проверить Gboard в настройках батареи?

savoljavob Искусственный Интеллект (170883) //проверить Gboard в настройках батареи// — Разрешение → Запуск в фоновом режиме и в Настройках Батареи → посмотрите Отключить фоновые приложении для экономии энергии

Не знаю актуально или нет, но я лично для своего телефона нашёл решение
У меня клавиатура по умолчанию Microsoft SwiftKey (свифт ушёл из России вместе с моей экранной клавой, кек)
Собственно? зайдя в настройки этой клавы — Ввод — Физическая клавиатура (да-да, именно физическая) — Автоматически показывать/скрывать виртуальную клавиатуру (Эта настройка превосходит системные настройки, то есть игнорирует всё)
У меня по умолчанию была включена эта настройка, то есть когда телефон считает, что я нажал куда-то на зону выше клавы — она сворачивается, но по факту — я печатал и никуда не нажимал (возможно есть глюки сенсора).
Телефон Honor 10 lite

Баги при работе с системной клавиатурой

Взаимодействуя с приложением, мы в определенный момент активируем системную клавиатуру для набора сообщения или заполнения необходимых полей. Сталкивались ли вы с ситуациями, когда клавиатура отображается, а вот поля для ввода сообщения нет или наоборот — клавиатура есть, куда вводить текст, не видно? Баги могут быть связаны как с проблемами внутри конкретного приложения, так и с общими недостатками системной клавиатуры.

Константин Мордань, iOS-разработчик из Mail.ru в своей работе повидал всякое: проанализировав способы управления клавиатурой в iOS, он решил поделиться основными найденными багами и подходами, которые применял для их обнаружения и исправления.

Осторожно: под кат мы поместили много гифок, чтобы наглядно демонстрировать баги. А еще больше примеров вы найдете в видео доклада Константина на AppsConf.

Реализация вызова системной клавиатуры

Давайте для начала разберемся, как вообще можно реализовать вызов клавиатуры.

Представим, что вы разрабатываете приложение, задача которого собрать Айка (персонажа South Park) в целого канадца с помощью клавиатуры. При нажатии Айку на живот выезжает клавиатура, тем самым поднимая ноги нашего героя к голове.

Для реализации задачи можно воспользоваться InputAccessoryView или обработкой системных уведомлений.

InputAccessoryView

Давайте рассмотрим первый вариант.

Во ViewController создаем View, которая будет подниматься вместе клавиатурой, и задаем ей фрейм. Важно, что эту View не надо добавлять в качестве subview. Далее переопределяем свойства canBecomeFirstResponder и возвращаем true. После переопределяем свойство UIResponder — inputAccessoryView и кладем туда View. Для закрытия клавиатуры добавим tapGesture и в его обработчике сбросим firstResponder, у созданной нами View.

class ViewController: UIViewController < var tummyView: UIView < let frame = CGRect(x: x, y: y, width: width, height: height) let v = TummyView(frame: frame) return v >override var canBecomeFirstResponder: Bool < return true >override var input AccessoryView: UIView? < return tummyView >func tapHandler ( ) < tummyView.resignFirstResponder ( ) >> 

Задача выполнена, а система сама обрабатывает изменения состояния клавиатуры, показывает ее и поднимает View, которая от нее зависит.

Обработка системных уведомлений

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

  • когда клавиатура будет/была показана: keyboardWillShowNotification, keyboardDidShowNotification;
  • когда клавиатура будет/была скрыта: keyboardWillHideNotification, keyboardDidHideNotification;
  • когда фрейм клавиатуры будет/был изменен: keyboardWilChangeFrameNotification, keyboardDidChangeFrameNotification.

Создаем keyboardTracker, в нем подписываемся на получение уведомления keyboardWillChangeFrame, а в обработчике получаем фрейм клавиатуры, конвертируем его из системы координат экрана в систему координат окна, вычисляем высоту клавиатуры и изменяем значение Y у View, которая должна подниматься клавиатурой, на эту высоту.

class KeyboardTracker < func enable ( ) < notificationCenter.add0observer(self, seleсtor: #selector( keyboardWillChangeFrame), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) >func keyboardWillChangeFrame ( notification: NSNotification) < let screenCoordinatedKeyboardFrame = (userInfo [ UIResponder.keyboardFrameEndUserInfoKey ] as! NSValue ) .cgRectValue let keyboardFrame = window.convert ( screenCoordinatedKeyboardFrame, from: nil ) let windowHeight = window.frame.height let keyboardHeight = windowHeight - keyboardFrame.minY delegate.keyboardWillChange ( keyboardHeight ) >> 

На этом наша задача выполнена, клавиатура поднимается, собирая Айка в канадца.

Как мы видим, реализация работы с клавиатурой довольно легкая в обоих случаях, поэтому каждый волен самостоятельно выбирать подходящий способ. У себя в проекте мы сделали выбор в пользу нотификаций, поэтому дальнейшие примеры и инсайты будут связаны именно с обработкой уведомлений.

В поисках багов

Если способ вызова клавиатуры настолько прост, то откуда взяться багам? Конечно, если в приложении воспроизводится лишь сценарий открытия и закрытия клавиатуры, то проблем не возникнет. А вот если изменить привычный ход вещей, вспомнить, что использовать клавиатуру может не только наше приложение, но и другие, а пользователь может еще и переключать между ними, то сюрпризов не избежать.

Давайте рассмотрим пример. Для этого воспользуемся нашим приложением с Айком: откроем клавиатуру, переключимся в Заметки, напечатаем что-то и вернемся обратно в приложение.

Какие проблемы уже видны? Во-первых, в App Switcher отсутствует клавиатура, хотя при сворачивании приложения она была, а вместо нее виден иной контент. Во-вторых, при возврате в приложение клавиатуры все еще нет, а ноги Айка опускаются вниз экрана.

Давайте разберемся в причинах такого поведения. Как мы все помним из схемы жизненного цикла приложения переходы приложения из активного состояния в неактивной сначала в foreground, а после в background занимают время.

А что же с жизненным циклом клавиатуры? В iOS в каждую единицу времени клавиатурой может владеть лишь одно из запущенных приложений, а вот нотификации об изменении состояния клавиатуры получают все подписанные на них приложения.

При переключении из одного приложения в другое система сбрасывает его firstResponder, что выступает триггером к скрытию клавиатуры. Система отправляет сначала уведомление keyboardWillHide для исчезновения клавиатуры, а затем keyboardDidHideNotification. Уведомление улетает и во второе приложение. В новом приложении мы открываем клавиатуру: система посылает keyboardWillShowNotification для появления клавиатуры и затем досылает keyboardDidShowNotification — демо, с фазами цикла.

Если вы посмотрите отрывок доклада (с 8:39), то увидите момент, когда после скрытия клавиатуры система посылает keyboardDidHideNotification для перехода первого приложения в неактивное состояние. При переключении в приложение для спорта и запуске клавиатуры система посылает keyboardWillShowNotification. Но так как процесс переключения и запуска быстр, а время перехода между фазами жизненного цикла бывает длиннее, то полученное уведомление обработает не только приложение для спорта, но и приложение для пива, которое еще не успело уйти в background.

Разобравшись в причинах, давайте теперь найдем решение проблемы с Айком.

Плохое решение

Первым в голову приходит идея отписки/подписки на уведомления при сворачивании/разворачивании приложения через enable/disable KeyboardTracker.

Для отписки используем метод applicationWillResignActive или обработчик аналогичного уведомления от системы, для подписки — applicationDidBecomeActive, но, чтобы ничего не упустить, мы еще поставим нотификацию при методе applicationWillEnterForeground, который вызывается когда приложение заходит в foreground, но еще не становится активным.

При запуске клавиатуры в приложении скорее всего все пройдет успешно, а вот при более сложных тестах, например, открытии клавиатуры и попытки записи голосового набора, решение работать не будет.

Что произошло? После нажатия на кнопку набора голосового сообщения, у приложения сбросился firstResponder, клавиатура закрылась, вызвался метод applicationWillResignActive и мы отписались от нотификаций. После закрытия алерта система восстановила стейт приложения, но до того как вызвался метод applicationWillEnterForeground и тем более applicationDidBecomeActive.

Хорошее решение

Иное решение — это применение защитного бульчика (Bool).

var wasTummyViewFirstResponderBeforeApp0idEnterBackground func willResignActive( notification: NSNotification) < wasTextFieldFirstResponderBeforeAppDidEnterBackground = tummyView.isFirstResponder >func willEnterForeground ( notification: NSNotification) < if wasTextFieldFirstResponderBeforeAppDidEnterBackground < UIView.performWithourAnimation < tummyView.becomeFirstResponder ( ) >> >

Запоминаем, была ли открыта клавиатура перед тему, как приложение перестало быть активным, а в методе applicationWillEnterForeground восстанавливаем предыдущий стейт. Единственное, что осталось исправить, — это дыру в app switcher.

app switcher

В app switcher отображаются снэпшоты приложений, которые делает система после перехода приложения в бэкграунд. В скриншоте видно, что снэпшот нашего приложения сделан в момент, когда клавиатура уже используется другим приложением. Это не критично, но и для исправления требуется всего пара кликов.

Неплохое решение

Решение можно позаимствовать у банковских приложений, которые научились скрывать чувствительные данные, а еще почитать у Apple.

Скрыть данные можно в методе applicationDidEnterBackground, заблюрить и показать splash screen, а в методе applicationWillEnterForeground вернуться к обычной иерархии вьюх.

Нам этот вариант не подходит, так как к моменту вызова метода applicationDidEnterBackground у нашего приложения уже нет клавиатуры.

Хорошее решение

Воспользуемся уже знакомыми методами willResignActive, willEnterForeground и didBecomeActive.

Пока у нашего приложения еще есть клавиатура, необходимо в методе willResignActive создать собственный снэпшот приложения и положить его в иерархию.

func willResignActive( notificaton: NSNotification)

В методах willEnterForeground и didBecomeActive восстанавливаем иерархию вьюх и удаляем наш снэпшот.

func willEnterForeground( notification: NSNotification) < imageView.removeFromSuperview( ) >func didBecomeActive( notification: NSNotification)

В итоге мы исправили оба кейса: в app switcher красивая картинка и клавиатура при переключении больше не прыгает. Казалось бы, не такие и важные вещи, но для продуктовой разработки эти моменты крайне важны.

Плохая новость

Наше успешное решение проблемы Айка касалось случая, когда перед сворачиванием приложения была открыта клавиатура. Если же переключение происходит без разворачивания клавиатуры, то мы вновь увидим, что ноги нашего Айка упали внизу.

Это не проблема только нашего приложения, такое поведение наблюдается и у Facebook, работающего с нотификациями, и даже у iMessage, использующего для управления клавиатурой inputAccessoryView. Это происходит из-за того, что перед переходом в фон приложения успевают обработать чужие клавиатурные нотификации.

interactively keyboard dismissing

Добавим немного функционала нашему приложению с Айком, научив программу интерактивно скрывать клавиатуру.

Плохое решение

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

func panGestureHandler( )

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

func keyboardView( ) -> UIView? < let windows = UIApplication.shared.windows let view = windows.first < (window) ->Bool in return keyboardView( fromWindow: window) != nil > return view >

К сожалению, это решение не будет нормально работать на iPhone X и выше, так как при движении пальца можно слегка задеть нижний индикатор, отвечающий за сворачивание приложение. После этого интерактивное скрытие перестает работать.

Проблема кроется в массиве окон.

После жеста система создает новое клавиатурное окно, поверх существующего. Немыслимо, но это правда. В итоге получается, что в массиве лежит два клавиатурных окна с одинаковыми координатами, но первое скрыто.

Получается, что, итерируясь по массиву окон, мы находим первое, удовлетворяющее условия, и начинаем с ним работать, не смотря на то, что оно скрыто.

Как это исправляется? Переворачиванием массива окон.

func panGeastureHandler( ) < let yPosition: CGFloat = 0.0 keyboardView( )?.frame.origin.y = yPosition >func keyboardView( ) -> UIView? < let windows = UIApplication.shared.windows.reversed( ) let view = windows.first < (window) ->Bool in return keyboardView( fromWindow: window) != nil > return view >

Особенности работы с клавиатурой на iPad

У клавиатуры на iPad помимо обычного состояния есть undocked состояние. Пользователь может перемещать ее по экрану, делить на две части и даже запускать приложение в режиме slide over (поверх другого). Конечно же, важно, чтобы во всех эти режимах клавиатура работала без багов.

Проверим на нашем Айке.

Увы, сейчас это не так. После того, как пользователь начинает двигать клавиатуру по экрану, ноги Айка улетают выше головы и появляются на месте только после следующего открытия клавиатуры. Попробуем это исправить на кейсе со сплитом клавиатуры.

Причины

Начнем с анализа уведомлений. После нажатия на кнопку split получаем две группы уведомлений — keyboardWillChangeFrameNotification, keyboardWillHideNotification, keyboardDidChangeFrameNotification, keyboardDidHideNotification. Отличие групп лишь в координатах клавиатуры.

Когда мы нажимаем на кнопку split, клавиатура уменьшается, и приходит первая группа уведомлений. Когда клавиатура разделилась и поднялась наверх — мы получили вторую пачку уведомлений.

Важно то, что мы получаем уведомления о том, что клавиатура скрылась, но но ни одного о том, что она показывается. Это, кстати, еще один плюс в пользу того, чтобы использовать keyboardWillChangeFrameNotification.

Почему же тогда ноги Айка улетают, как только мы начинаем двигать клавиатуру по экрану?

В этот момент система посылает нам keyboardWillChangeFrameNotification, но координаты, которые там лежат — (0.0, 0.0, 0.0, 0.0), так как система не знает, в какой именно точке окажется клавиатура, после того как движение закончится.

Если подставить нули в текущий код, который обрабатывает изменение фрейма клавиатуры, окажется, что высота клавиатуры равна высоте окна. Вот и причина, почему ноги Айка вылетают за пределы экрана.

Хорошее решение

Чтобы решить нашу проблему, для начала научимся понимать, когда клавиатура находится в undocked-режиме и пользователь может двигать ее по экрану.

Для этого достаточно сравнить высоту окна и maxY клавиатуры. Если они равны, то клавиатура в своем обычном состоянии, если maxY меньше высоты окна, то пользователь двигает клавиатуру. В результате в keyboardTracker появляется следующий код:

class KeyboardTracker < func enable( ) < notificationCenter.addObserver( self, selector:#selector( keyboardWillChangeFrame), name:UIResponder.keyboardWillChangeFrameNotification, object:nil) >func keyboardWillChangeFrame( notification: NSNotification) < let screenCoordinatedKeyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue let leyboardFrame = window.convert ( screenCoordinatedKeyboardFrame, from: nil) let windowHeight = window.frame.height let keyboardHeight = windowHeight - keyboardFrame.minY let isKeyboardUnlocked = isIPad ( ) && keyboardFrame/maxY < windowHeight if isKeyboardUnlocked < keyboardHeight = 0.0 >delegate.keyboardWillChange ( keyboardHeight) > >

Мы кастомно задали высоту равную нулю и теперь при движении клавиатуры ноги Айка опускаются вниз и фиксируются там.

Единственное оставшееся недоразумение — это тот факт, что при сплите клавиатуры ноги Айка не сразу опускаются вниз. Как это исправить?

Научим keyboardTracker работать не только с keyboardWillChangeFrameNotification, но и с keyboardDidChangeFrame. Новый код писать не придется, достаточно добавить проверку, что это iPad, чтобы не делать лишних вычислений.

class KeyboardTracker

Как же обнаружить баги?

Обильное логирование

На нашем проекте логи пишутся в следующем формате: в квадратных скобках имя модуля и сабмодулей, к которому относится лог, а затем текст самого лога. Например, вот так:
[keyboard][tracker] keyboardWillChangeFrame: calculated height — 437.9

В коде это выглядит следующим образом — создается logger с верхнеуровневым тэгом и передается в трекер. Внутри трекера от logger отпочковывается дочерний logger с тэгом второго уровня, который и используется для логирования внутри класса.

class KeyboardTracker < init(with logger: Logger) < self.trackerLogger = logger.dequeue(withTag: "[tracker]") >func keyboardWillChangeFrame(notification: NSNotification) < let height = 0.0 trackerLogger.debug("\(#function): calculated height - \(height)") >>

Таким образом я залогировал весь keyboardTracker, что хорошо. При обнаружении же тестировщиками проблем я брал файл с логами и искал, где именно не сошлись фреймы. Это занимало слишком много времени, поэтому кроме логирования стали применяться и другие приемы.

Watchdog

У нас на проекте для оптимизации UI потока используется Watchdog. Об этом рассказывал Дмитрий Куркин на одном из прошлых AppsConf.

Watchdog — это процесс или поток, который следит за другим процессом или потоком. Такой механизм позволяет отслеживать состояние клавиатуры и зависящих от нее вьюх и сообщать о возникающих проблемах.

Для реализации такого функционала создаем таймер, который будет раз в секунду проверять корректность расположения вьюхи с ногами Aйка или при ошибках логировать это.

class Watchdog < var timer: Timer? func start ( ) < timer = Timer ( timeInterval: 1.0, repeats: true, block: < ( timer ) in self.woof ( ) >) > >

Кстати, логировать можно не только конечные результаты, но и промежуточные расчеты.

В итоге обильное логирование + Watchdog давало точные данные о проблеме, состоянии клавиатуры и уменьшало время на исправление багов, но мало чем помогало бета-пользователям, которым приходилось терпеть ошибки до следующего релиза.

А что если watchdog можно обучить не только находить проблемы, но и исправлять их?

В код, где watchdog дает заключение о том, что координаты вьюх не сходятся, дописываем метод fixTummyPosition и автоматически ставим координаты на место.

В этом варианте у меня в логах скапливается куча полезной информации, а пользователи вообще не замечают визуальных проблем. Это вроде отлично, но теперь не получится узнавать о каких-либо проблемах с клавиатурой.

На помощь приходит добавление в метод watchdog возможности генерации тестового крэша при обнаружении ошибки. Конечно, этот код добавляется под ремоут конфигом.

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

Dashboard

Последний прием, который мы ввели — это отправка статистики в том момент, когда wahtchdog фиксировал статистику. По полученным данным мы построили график количества выявляемых ошибок и уже после первой итерации число срабатываний удалось уменьшить в четыре раза. Конечно, до нуля снизить проблемы не удалось, но основные жалобы от пользователей прекратились.

Уже на следующей неделе в Питере пройдет Saint AppsConf, на которой можно задать вопросы не только Константину, но и многочисленным докладчикам iOS-трека.

  • Блог компании Конференции Олега Бунина (Онтико)
  • Разработка под iOS
  • Разработка мобильных приложений
  • Swift

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *