Отключение расширения автозаполнения на iPad приводит к тому, что хост-приложение не отвечает
Я разрабатываю расширение автозаполнения (AppEx) и наткнулся на следующую ошибку, которая возникает только на iPad.
Эта ошибка воспроизводится только на устройстве (не воспроизводится на симуляторе) и может наблюдаться, например, в приложении Dashlane.
Действия по воспроизведению:
- Включите автозаполнение для соответствующего приложения в настройках iOS -> Пароли -> Автозаполнение пароля.
- Откройте приложение, например LinkedIn или Netflix.
- Откройте расширение приложения для автозаполнения (не используйте QuickType, если это предлагается)
- Попробуйте закрыть модальное представление автозаполнения, нажав за его пределами (не закрывайте кнопкой «Отмена»).
- Теперь хост-приложение (LinkedIn или Netflix) перестает отвечать на запросы.
Полное демонстрационное видео выпуска. После закрытия представления автозаполнения невозможно активировать ни одно из текстовых полей в приложении LinkedIn:
Демонстрационное видео проблемы с автозаполнением
Возможные решения
Я обнаружил, что основная причина того, что приложение не отвечает, заключается в том, что система по-прежнему предполагает, что «управление» связано с расширением автозаполнения, а не с хост-приложением, даже когда представление автозаполнения закрыто.
Я понял это, запустив вызов метода через некоторое время после представления контроллера автозаполнения, так что вся последовательность стала следующей (тайм-коды просто иллюстрируют порядок и скорость, с которой происходят события):
- Присутствует контроллер автозаполнения (0:00)
- Нажмите за пределами контроллера автозаполнения (0:01)
- Вызов метода (0:02)
Вызов метода был одним из таких (может работать любой из них):
@objc private func close(_ sender: AnyObject?) {
self.extensionContext.completeExtensionConfigurationRequest()
}
@objc private func cancel(_ sender: AnyObject?) {
self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code: ASExtensionError.userCanceled.rawValue))
}
Итак, еслиextensionContext
получает информацию о том, что пользователь отменил запрос автозаполнения, в этом случае система правильно возвращает управление хост-приложению (например, LinkedIn).
Вопрос в том, как я могу наблюдать за событием «нажатие вне модального экрана» и соответственно вызывать один из методов?