Вопрос пользователя заключается в том, что при загрузке JavaScript API Google Maps в встроенный веб-браузер (TWebBrowser) из приложения на Delphi, начиная с версии 3.29, отображается сообщение об ошибке: "You are using a browser that is not supported". Проблема связана с тем, что API Google Maps проверяет строку пользовательского агента браузера, и хотя используется Internet Explorer 11, строка пользовательского агента, отправляемая серверу, некорректна.
Решение проблемы
Для решения проблемы с отображением JavaScript API Google Maps в TWebBrowser на Delphi, необходимо изменить строку пользовательского агента, которую отправляет браузер. В стандартной конфигурации TWebBrowser использует определенные значения по умолчанию, которые могут быть некорректными для работы с некоторыми веб-сервисами.
Изменение строки пользовательского агента в Delphi
Для изменения строки пользовательского агента в компоненте TWebBrowser, можно использовать следующий подход:
Создайте новый класс, производный от TWebBrowser, в котором переопределите метод Invoke. Этот метод необходимо настроить на возвращение желаемой строки пользовательского агента, когда запрашивается свойство DISPID_AMBIENT_USERAGENT.
Затем, используя интерфейс IOleControl компонента, вызовите метод OnAmbientPropertyChange для сигнализации изменения значения свойства DISPID_AMBIENT_USERAGENT.
Пример кода на Object Pascal для создания производного класса:
type
TCustomWebBrowser = class(TWebBrowser)
private
function InvokeSelf(ggi: TGUID; DispID: Integer; const args, argsSize, var result, var pExcepInfo, dwDisposalFlags: Integer; var pNameProp: POleStr): HRESULT; override;
end;
TWebBrowserWithCustomUserAgent = class(TCustomWebBrowser)
public
constructor Create(AOwner: TComponent); override;
end;
constructor TWebBrowserWithCustomUserAgent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// Здесь можно установить начальное значение строки пользовательского агента
// Например: UserAgentString := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3';
end;
function TCustomWebBrowser.InvokeSelf(ggi: TGUID; DispID: Integer; const args, argsSize, var result, var pExcepInfo, dwDisposalFlags: Integer; var pNameProp: POleStr): HRESULT; override;
begin
if DispID = DISPID_AMBIENT_USERAGENT then
begin
// Здесь нужно установить строку пользовательского агента, которую хотите использовать
// Например: System.ObjStrCopy(Result, PChar(UserAgentString), -1);
// Возвращаем успешный результат выполнения
Result := S_OK;
end
else
Result := inherited InvokeSelf(ggi, DispID, args, argsSize, result, pExcepInfo, dwDisposalFlags, pNameProp);
end;
После изменения строки пользовательского агента, убедитесь, что вы вызовете OnAmbientPropertyChange для компонента IOleControl, чтобы уведомить веб-браузер о смене значения.
Альтернативный ответ и дополнительные соображения
В случае использования FMX TWebBrowser на платформах Android и iOS, процесс изменения строки пользовательского агента может отличаться и требует дополнительных действий, таких как использование RTTI или изменения глобальных настроек.
Заключение
Изменение строки пользовательского агента в TWebBrowser позволяет корректно отображать веб-контент, требующий определенной строки пользовательского агента для работы. Важно правильно настроить эту строку, чтобы избежать конфликтов с веб-сервисами, такими как Google Maps JavaScript API.
Обратите внимание, что изменение строки пользовательского агента может повлечь за собой другие последствия, такие как изменение поведения веб-страниц, предназначенных для работы с конкретными версиями браузеров.
Пользователь столкнулся с ошибкой отображения JavaScript API Google Maps в TWebBrowser на Delphi и ищет решение, связанное с изменением строки пользовательского агента для корректной работы API.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.