【问题标题】:Xamarin: Error trying to show WebView using OpenLayers maps with html and javascriptXamarin:尝试使用带有 html 和 javascript 的 OpenLayers 地图显示 WebView 时出错
【发布时间】:2019-05-30 15:39:38
【问题描述】:

我正在尝试使用 WebView 组件在 xamarin 中显示地图, 尝试将此代码传递给 html 文件,它工作正常。 WebView 来自 Xamarin.Forms

线路alert('test'); 并且 html 正文中的单词 App 显示没有问题,但地图没有显示。

用于测试的设备正在运行 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);

【问题讨论】:

    标签: c# xamarin webview openlayers


    【解决方案1】:

    第一个:更改您的脚本链接使用https(与http相比)

    第二个:OpenLayers.js 脚本本身使用了很多不安全的链接,这在 iOS 和 Google 的新 Android API 级别上是个问题,因为默认情况下所有链接都应该是安全的 (https)。

    如果您查看应用程序输出,您将看到以下日志消息:

    App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时异常。

    iOS:

    因此,在 iOS 上,您必须在应用的 Info.plist 中添加一个例外,例如:

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

    回复:https://stackoverflow.com/a/40299837/4984832

    安卓:

    从 Android 9(API 级别 28)开始,默认禁用明文支持。

    在 Android 9+ 上,您将为您的应用添加一个安全例外 (cleartextTrafficPermitted)

    回复:https://stackoverflow.com/a/55997456/4984832

    注意:我的基于 Xamarin 的答案已链接,或直接通过该问题的其他答案编辑清单。

    顺便说一句:最终的答案是向 OpenLayers 提交一个错误,以便在其所有脚本中使用安全端点,这样就不必申请应用程序安全例外......

    【讨论】:

    • 它可以工作,谢谢,但还有其他方法可以在 xamarin 中实现 OpenLayers,我在 nugets 存储库中搜索了一些好的库但没有结果。我想要谷歌地图的替代品
    • @lucianocba OpenLayers/OpenStreetMap 具有 Rest-API 端点(这是他们的 JS 库使用的),因此您“可以”编写 C#/Xamarin 接口/前端,但不确定是否值得付出努力(当然我不知道你的应用程序的要求)...有OsmSharp之类的项目,但我没有用过,只是javascript/浏览器界面。
    • 向 OpenLayers 提交该库的错误报告是有意义的,它的第 2 版最后一次更新是在 2013 年。下一个版本将是第 6 版。
    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 2021-11-03
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多