Функция обратного вызова Delphi из TWebBrowser с помощью javascript на Delphi XE6 для всех платформ (включая iOS, ANDROID)?

Мне нужно создать приложение на Delphi XE6 для Android и iOS. Это приложение должно использовать TWebBrowser для отображения Карт Google, тогда мне нужно «отправить» из Delphi в javascript и «получить» команду из javascript в Delphi. Таким образом, я могу показать рынок на карте, а затем узнать, когда пользователь нажимает маркер. Я нашел эту статью в Интернете, чтобы выполнить javascript с помощью кода Delphi.

Но у меня нет идеи о том, как вызывать процедуру delphi из javascript. Например, у меня есть эта процедура на Delphi:

procedure JSFeekback(aParm1, aParm2, aParm3, aParm4: string); 

И я хочу использовать Javascript-код на TWebBrowser, чтобы назвать его параметром pass 4. Я нашел похожие вопросы, но только для приложений Windows, и ответы не работают на Android (я не пробовал на iOS).

Правильный способ сделать это с addJavascriptInterface функции addJavascriptInterface для Android WebView, как здесь видно здесь и здесь .

FireWire TWebBrowser не предоставляет эту функцию по умолчанию.

В DPF Android есть настраиваемый элемент управления WebView, как это видно.

Вы можете изменить этот элемент управления, чтобы добавить функцию addJavascriptInterface .

Для TWebBrowser в IOS вы можете использовать пользовательские элементы управления веб-браузером в sourceforge и здесь .

Другой возможный способ сделать это – это событие OnShouldStartLoadWithRequest для TWebBrowser. Вы могли бы сделать что-то вроде:

 <script language=”javascript” type=”text/javascript”> window.location.href=”#param1&param2&param3&param4”; </script> 

или

 <script language=”javascript”> window.navigate(”javascript:thisisatest();”); </script> 

И посмотрите, содержит ли свойство URL-адреса OnShouldStartLoadWithRequest #param1&param2&param3&param4 или javascript:thisisatest(); ,

В основном идея состоит в том, чтобы перейти к URL-адресу, который не изменяет URL-адрес существующей страницы и не забирает этот URL-адрес в событии OnShouldStartLoadWithRequest .

С JavaScript очень распространено обращение к HTTP-серверам, например, через jQuery. Если вы можете сделать свой код Delphi доступным через HTTP, либо в качестве локального сервера в Интернете, ваш код JavaScript может вызывать код Delphi, отправив HTTP-запрос и получая данные из функций Delphi в качестве ответа HTTP.

Другим вариантом являются WebSockets. Они являются расширением HTTP, работают асинхронно, поэтому сервер Delphi может отправлять данные в сценарий – без необходимости ждать запроса сначала (известного как push-сервер / Comet).

Это будет стандартное, широко используемое решение, которое не зависит от конкретного веб-клиента. Бесплатная библиотека с открытым исходным кодом Internet Direct (Indy) может использоваться на всех поддерживаемых платформах для создания HTTP-серверов, автономных или интегрированных с вашим приложением.

Другие протоколы, которые доступны для связи между JavaScript и серверами, также заслуживают внимания, например, STOMP.

Для вашей конкретной функции HTTP-вызов может использовать запрос GET с параметрами:

 http://localhost/JSFeekback?par1=val1&par2=val2&par3=val3&par4=val4 

TWebBrowser.URL можно изменить в javascript:

 window.location.href=”#param1&param2&param3&param4”; 

Затем запустите таймер, чтобы проверить TWebBrowser.URL, получить параметры, вызвать JSFeekback, сбросить URL.

Или нет таймера, код выглядит следующим образом:

  wb1.EvaluateJavaScript("window.location.href=”#param1&param2&param3&param4”;"); getParams(wb1.URL); JSFeekback(p1, p2, p3, p4);