You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms WebView加载OpenLayers地图失败问题求助

解决Xamarin.Forms WebView在Android 9中无法加载OpenLayers地图的问题

既然你的WebView能正常显示文本和触发alert('test'),说明WebView的JavaScript和基础渲染功能都没问题,地图加载失败基本是两个常见原因导致的:Android 9的HTTP请求限制,或者地图容器没有设置明确尺寸。下面一步步来解决:

1. 解除Android 9的HTTP网络限制

Android 9(API 28)默认禁止应用发起非HTTPS的网络请求,而你代码里引用的OpenLayers脚本是http://www.openlayers.org/api/OpenLayers.js,还有OSM的默认瓦片也是HTTP地址,这些请求都会被系统拦截。

具体操作:

在Android项目的Resources/xml文件夹下新建network_security_config.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

接着打开AndroidManifest.xml,给<application>标签添加这个配置的引用:

<application ... android:networkSecurityConfig="@xml/network_security_config">

2. 给地图容器设置明确的宽高样式

你的HTML里的mapdiv没有设置任何尺寸,OpenLayers需要一个有固定宽高的容器才能渲染地图。把<div id='mapdiv'>改成:

<div id='mapdiv' style="width: 100%; height: 500px;"></div>

这样容器就有了明确的高度和自适应宽度,地图就能正常渲染了。

3. 优先使用HTTPS资源(推荐)

为了避免后续的安全警告和兼容性问题,建议把OpenLayers的脚本地址换成HTTPS版本:

<script src='https://openlayers.org/api/OpenLayers.js'></script>

OSM的瓦片也支持HTTPS,OpenLayers会自动适配,这样也能减少网络限制带来的问题。

4. 确认WebView的基础配置(可选)

虽然alert能运行说明JavaScript已经启用,但如果还是有问题,可以在Android项目的MainActivity.cs里确认WebView的设置:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    // 如果你用了自定义WebView渲染器,可以在这里确保JS、缩放等功能开启
    // 比如:Control.Settings.JavaScriptEnabled = true;
}

修改后的完整HTML代码示例

var htmlSource = new HtmlWebViewSource();
htmlSource.Html = @"<html> 
<head> 
<script src='https://openlayers.org/api/OpenLayers.js'></script> 
</head> 
<body> 
App 
<div id='mapdiv' style='width: 100%; height: 500px;'></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>";

按照这些步骤修改后,你的地图应该就能在Android 9的WebView里正常加载了。

内容的提问来源于stack exchange,提问作者luciano cba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:51:34