Вернувшись к этому вопросу, я нашел другое частичное решение. Оказывается, что диалоговое окно недопустимого протокола не блокирует выполнение JavaScript, как предупреждение.
Итак, вот как вы справляетесь с отступлением при запуске приложения из Интернета:
- Зарегистрируйте обработчик setTimeout для перенаправления на резервную страницу (с помощью window.location.replace) после, скажем, 500 мс
- Зарегистрируйте обработчик onBlur, который отменяет время ожидания
- Открыть URL с вашим пользовательским протоколом
- Если приложение установлено, браузер откроет приложение, размывая страницу и отменяя запасной вариант
- Если приложение не установлено, пользователь увидит диалоговое окно не более 500 мсек, пока его не унесут на запасную страницу
Мне на самом деле это нравится больше, потому что, с одной стороны, люди, не имеющие приложения, иногда получают всплеск диалога на сайте, с другой стороны, это не влияет на первый запуск приложения. Техника, описанная в ответе Хантауба, вызывает первый пара отвлекающих переходов и вспышку мобильного сафари при первом запуске приложения.