Очень часто диалог начинается с
-«А вот в моём браузере есть ...тут какой-то функционал...»
Таким людям очень хочется предложить
загрузить в Google Play свой любимый браузер. Собственно, если вам он так нравится, и в нём всё хорошо работает - просто откройте консоль разработчика и загрузите туда exe файл Firefox. (см примечание 1)
Или ещё бывают подобные претензии.
-«почему в браузере работают пуш уведомления, а в вебвью их надо подключать отдельно?»
Вроде как компонент вебвью делает Google, «забывает» туда добавить веб пуши, а виноват почему-то я. (Некоторые люди думают что webview делает разработчик приложения)
Ладно, шутки шутками, а ниже я подробно объясню что такое webview и почему это не браузер.
Краткое введение в основы разработки приложений:
-
Нативные приложения -
это приложения которые имеют нативные элементы управления (контролы) - кнопки, списки, календарь и прочее. Их так и называют View компоненты или элементы.
Пример:
- (TextView) - отобразит текст
- (Button) - отобразит кнопки
- (ImageView) - отобразит картинку
Всё это дело верстается, подумать страшно, в XML файле. Вы просто открываете Android Studio - прописываете в файле компоновки экрана ваши кнопки, чекбоксы и прочее (немного напоминает вёрстку HTML), делаете какую-то магию на Java - и ваши элементы появляются на экране приложения. Где-то среди всех этих вьюшек затерялся наш WebView компонент.
Если его добавить в макет экрана и присвоить его атрибуту src нужный URL, то при запуске приложения на экране произойдёт то, что всем так необходимо - отобразится ваш сайт. Здесь и начинаются основные недопонимания этого компонента. Ведь сайты большинство людей просматривают в браузере, а если что-то показывает сайт, то мозг начинает воспринимать это как браузер. Например, если что-то имеет 4 колеса, руль, мотор и едет, то - это машина. Или 4 колёсный мотоцикл? Или быть может это просто детский велосипед с игрушечным моторчиком?
Так и с webview компонентом - это именно компонент, а не браузер.
Webview это компонент, который встраивается в макет экрана, и способен выполнить рендеринг HTML, CSS и Javascript - т.е. отобразить содержимое web страницы. Он никак не связан с установленным в системе браузером на уровне обмена данными, т.е. не может получить ваши пароли если вы их введи ранее в браузере.
Если вы присмотритесь повнимательнее, то заметите что на этом все функции в прочем и заканчиваются. Здесь нет как в браузере панели закладок, возможности открывать разные вкладки, адресной строки и вообще ничего нет.
Далее мы подробно опишем что же есть в Webview, а чего нет.
Как вы можете увидеть из данной картинки большинство привычных функций браузера в webview компоненте отсутствуют. Справедливости ради стоить отметить, что отсутствует практически все, кроме рендеринга HTML и JS движка. Поэтому сделав простое вебвью в андроид студии вы с удивлением заметите что ваши Cookies на сайте не работают, а файлы не загружаются. Вы всё ещё хотите
сэкономить 500 рублей на разработке вебвью приложения под IOS и сделать сами?
Как быть в данной ситуации? Каждый разработчик webview приложений выкручивается как может и справляется с учётом своей сообразительности и способностей. Например чтобы осуществить загрузку файлов с сайта на ваш смартфон, нужно:
- - получить разрешение на доступ к файловой системе android.permission.WRITE_EXTERNAL_STORAGE
- -Повесить обработчик события на скачивание файлов в webview
- -Скачать файл одним из способов на JAVA.
Так обстоят дела и с другими «привычными функциями браузера». Например Alert(), вызванный на вашем сайте, совсем никак не отобразиться в вебвью. Почему? Всё очень просто. Это своего рода «системное» событие, которое останавливает весь поток событий javascript, до тех пор, пока пользователь не нажмёт кнопку «ОК» в появившемся сообщении. Поэтому, когда вы делаете вебвью, вам нужно перехватить это событие, и дальше вручную приостановить выполнение яваскрипт в вашем компонете, и вручную вывести сообщение через какой-нибудь нативный View элемент.
Toast toast = Toast.makeText(getApplicationContext(),
"На сайте произошёл Alert!", Toast.LENGTH_SHORT);
toast.show();
Загрузка Chrome CustomTubs
1. Все таки внешние ссылки надо уметь открывать в стандартном браузере
Потому что там у людей уже есть авторизация зачастую, а при открытии из вебview ее нет - надо заново авторизовываться. И это создает существенный барьер зачастую.
В моем случае это создает проблему для функционала Поделиться, обращению к телеграму (не распознает протокол tg:), и еще для целого ряда вещей. И я там частенько отправляю людей на внешние сайты, а при открытии их в вебвью могут быть проблемы - и не только с авторизацией. Facebook, скажем. отказывается запускать свой авторизующий плагин при открытии в webview
Решением была бы возможность как нибудь специально разметить
ссылки для открытия в стандартом браузере (использовать другой протокол, типа ehhtps:// или добавлять какой то параметр, в путь добавлять домен последнего уровня типа ext.
.ru или еще как то). Я на сайте, увдев, что он открыт из приложения, могу легко переписать все внешние ссылки, добавив к ним то что надо.
2. Есть проблема с авторизацией при первом входе в приложение. Как правило, приложение будут ставить пользователи сайта, причем зачастую уже авторизованные. Хотелось бы, чтобы авторизация как то прокидывалась в приложение. У меня есть авторизующий токен, который, если добавить в урл, авторизация происходит автоматом.
В идеале мне бы хотелось иметь на сайте ссылку Перейти в приложение, по которой запустится приложение с переданным ему авторизующим ключем (если оно есть) или скачается, установится и запустится - опять же с этим же ключем. кажется такая штука называет deeplink
3. существует простое решение обоих этих проблем - (он реализован некоторыми поставщиками услуги переделки сайта в приложение) - это просто по умолчанию на любые загрузки страниц, кроме первой открывать штатный браузер. Т.е. приложение работает просто как лунчер сайта - показывает страницу заставку, и редиректится на страницу, принимающую токен (котора япри этом открывается просто в браузере).
Я понимаю, что это в корне противоречит вашей идеологии (по максимум мимикрироваться под нативное приложение), но в моем случае это решило бы все проблемы в корне.
Может прикрутите такую штуку за какие нибудь отдельные деньги? Я думаю, это могла бы быть просто настройка в админке... Наверняка не только мне это будет полезно - не всем надо мимикрироваться (основной кайф приложения ведь не в этом, а в том что про него труднее забыть и в него можно пушить), но не все готовы мириться с проблемами с функциональностью или вкладываться в их решение...
Ссылки телеграм работают
вы протестируйте посмотрите.
Авторизация в фейсбуке работает
Насчёт того, если он не будет залогинен в вебвью это да - надо будет логинится.
Но так и про браузер можно сказать. Если он его откроет в системном браузере, и захочет в фейсбуке залогинится, а при этом сидит не в хроме, а в опере? Тоже самое будет
там сейчас 5 браузеров топовых - гугл, опера, лиса, дельфин, и ещё что то
В каком из них он залогин в ефйсбуке никто не знает
Вы из этого лаунчера его перекинете на системный браузер, а он в фейсбуке из под оперы захоит, и так же надо будет пароль ввводить
Тут схитрить не выйдет. Авторизация это всегда ввод пароля
Здравствуйте. Не мог раньше проверить приложение так как сейчас в поездке. Поставил нашу линку в документе как вы сказали. Сейчас проблем с открытием приложения и попадания на офер не было. Но осталась проблема с тем чтобы юзер как я описывал выше после выхода из приложения постоянно попадал туда где он зарегистрировался осталась. Я сделал регистрацию 3 раза. Первый раз после перезагрузки телефона меня выкинуло заново на регистрацию уже по другому оферу, второй раз я попал туда где закончил пользоваться сайтом, третий раз меня выкинуло на сайт заглушку. Для нас как уже описывал выше один из самых главных моментов , чтобы юзер всегда попадал на один и тот же офер уже зарегистрированный. У меня есть также 2-5 приложений сейчас для тэстов. Те же самые действия я провел с ними. И все происходит именно так как должно быть. Получаеться осталось уладить этот момент
Сейчас еще раз попробовал. После регистрации и просмотра сайта, закрывал приложение, и перезагружал телеофн 3 раза. 2 раза после долгой загрузки попадал обратно куда нужно, 3 раз сначало вроде начал прогружаться нужный сайт а потом выкинуло на сайт заглушку