Xamarin: ошибка при попытке показать WebView с использованием карт OpenLayers с html и javascript

Я пытаюсь показать карту в xamarin с помощью компонента WebView, попробуйте передать этот код в html-файл, и он отлично работает. WebView взят из Xamarin.Forms.

Линия alert('test'); и слово App в теле html отображается без проблем, а карта не показывает.

Устройство для тестирования работало под управлением Android 9.

    var browser = new WebView();
    browser.HeightRequest = 600;
    browser.WidthRequest = 600;

    var htmlSource = new HtmlWebViewSource();
    htmlSource.Html = @"<html>
                           <head>
                              <script src='http://www.openlayers.org/api/OpenLayers.js'></script>
                            </head>
                            <body>
                                 App
                                  <div id='mapdiv'></div>
                                  <script>
                                       alert('test');  
                                       map = new OpenLayers.Map('mapdiv');
                                       map.addLayer(new OpenLayers.Layer.OSM());

                                       var lonLat = new OpenLayers.LonLat(-0.1279688, 51.5077286)
                                      .transform(
                                       new OpenLayers.Projection('EPSG:4326'), 
                                       map.getProjectionObject() 
                                    );

                                      var zoom = 16;

                                      var markers = new 
                                      OpenLayers.Layer.Markers('Markers');
                                      map.addLayer(markers);

                                      markers.addMarker(new OpenLayers.Marker(lonLat));

                                      map.setCenter(lonLat, zoom);
                                </script>
                      </body></html>";

                    browser.Source = htmlSource;
                    Children.Add(browser);
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
760
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1-й: Измените использование ссылки на скрипт https (по сравнению с http)

2-й: сам скрипт OpenLayers.js использует много незащищенных ссылок, и это проблема для iOS и новых уровней Android API от Google, поскольку по умолчанию все ссылки должны быть безопасными (https).

Если вы просмотрите выходные данные приложения, вы увидите такие сообщения журнала, как:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

iOS:

Итак, на iOS вам нужно будет добавить исключение в Info.plist вашего приложения, например:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Re: https://stackoverflow.com/a/40299837/4984832

Андроид:

Starting with Android 9 (API level 28), cleartext support is disabled by default.

На Android 9+ вы добавите исключение безопасности в свое приложение (cleartextTrafficPermitted)

Re: https://stackoverflow.com/a/55997456/4984832

Примечание. Мой ответ на основе Xamarin связан или отредактируйте манифест напрямую через другие ответы на этот вопрос.

Кстати: окончательным ответом было бы зарегистрировать ошибку в OpenLayers, чтобы использовать безопасные конечные точки во всех их сценариях, чтобы исключения безопасности приложений не применялись для...

Это работает, спасибо, но есть другой способ реализовать OpenLayers в xamarin, я ищу хорошие библиотеки в репозитории nugets безрезультатно. Я хочу альтернативу картам Google

luciano cba 30.05.2019 19:12

@lucianocba OpenLayers/OpenStreetMap имеют конечные точки Rest-API (это то, что используют их библиотеки JS), поэтому вы «могли бы» написать интерфейс/интерфейс C#/Xamarin, но не уверены, что это стоит усилий (конечно, я не знаю вашего приложения). требования)... Есть такие проекты, как OsmSharp, но я не использовал ни один из них, только интерфейс javascript/браузер.

SushiHangover 30.05.2019 19:21

Есть смысл подать отчет об ошибке в OpenLayers для этой библиотеки, ее версия 2 последний раз обновлялась в 2013 году. Следующим выпуском будет версия 6.

Mike 30.05.2019 23:54

Другие вопросы по теме