Пользовательское приложение iOS от Google, Gboard, имеет интересную функцию, которая не может быть выполнена с использованием общедоступных API-интерфейсов в SDK для iOS ( с IOS 10). Я хотел бы точно знать, как Google выполняет задачу по программному возврату одного приложения в стек переключения приложений в Gboard.
Пользовательские клавиатуры iOS имеют два основных компонента: контейнерное приложение и расширение для клавиатуры. Расширение приложения для клавиатуры запускается в отдельном процессе ОС, который запускается всякий раз, когда пользователь находится в любом приложении на своем телефоне, которое требует ввода текста.
Это приблизительные шаги, которые можно выполнить, используя Gboard, чтобы увидеть эффект программного возврата в предыдущее приложение:
- Пользователь запускает приложение Apple Messages на своем iPhone и отбирает текстовое поле, чтобы начать ввод текста.
- Открывается расширение клавиатуры Gboard, и пользователи видят специальную клавиатуру Gboard (пока они все еще находятся в приложении Apple Messages).
- Пользователь вводит ключ микрофона внутри расширения клавиатуры Gboard для ввода текста в речь.
- Gboard использует настраиваемую схему URL для запуска приложения-контейнера Gboard. Клавиатура Gboard и приложение Apple отправляются на один уровень в стек приложения, а приложение контейнера Gboard теперь является самым передним приложением в стеке приложений. Приложение контейнера Gboard использует микрофон для прослушивания речи пользователя и переводит его в текст, который он помещает на экран.
- Пользователь нажимает кнопку "Готово", когда их удовлетворяет ввод текста, который они видят на экране.
- Здесь происходит волшебство... при отключении экрана ввода текста приложение-контейнер Gboard также автоматически отбрасывается. Приложение контейнера Gboard уходит и заменяется приложением Apple Messages (иногда процесс расширения клавиатуры Gboard все еще жив, иногда он перезагружается, а иногда его нужно перезапустить вручную, нажав внутри текстового поля.). Как Google выполняет это?
- Наконец, пользователь видит текст, который был просто переведен автоматически вставлен в поле ввода текста. Предположительно Google выполняет это посредством обмена данными между приложением контейнера Gboard и расширением клавиатуры.
Я бы предположил, что Google использует частные API-интерфейсы, исследуя иерархию представлений строки состояния, используя Objective-C интроспекцию времени выполнения и как-то синтезируя события крана или вызывая открытый объект/действие. Я изучил это очень мало и смог найти интересные подклассы UIView внутри строки состояния, например UIStatusBarBreadcrumbItemView, который содержит массив UISystemNavigationAction s. Я продолжаю изучать эти классы в надежде, что смогу найти способ репликации взаимодействия с пользователем.
Я понимаю, что использование частных API-интерфейсов - это хороший способ, чтобы ваше приложение отклонялось из App Store - это не проблема, о которой я бы хотел ответить в ответ. Я смотрю в первую очередь на конкретные ответы о том, как именно Google выполняет задачу по программному возврату одного приложения в стек переключения приложений в Gboard.