flutter webviewIOS高德地图自定义样式未加载

使用flutter的inappWbeview嵌入js的高德地图自定义样式IOS端没展示, android端没事。有没有IOS小伙伴解释一下,使用系统浏览器打开可以展示,飞书内置浏览器也可以展示,微信内置浏览器也可以展示,使用IOS原生写的WKwebview展示的也是没有样式的
https://lbs.amap.com/demo/amap-ui/demos/amapui-amaploader/amapui-amaploader1 这个地址直接用iOS原生加载与IOS浏览器加载不一致

该回答引用ChatGPT

如果在使用 Flutter 的 InAppWebView 嵌入高德地图自定义样式的过程中,在 iOS 端没有正确展示,可能有以下几个原因:

1、InAppWebView 版本过低:在 InAppWebView 的早期版本中,可能存在一些与 iOS 平台相关的问题。可以尝试升级到最新版本,查看是否有改进。

2、JS 代码的问题:可能是因为嵌入的 JS 代码有误,导致自定义样式无法正确加载。可以尝试检查 JS 代码是否正确、是否存在语法错误等问题。

3、iOS 平台限制:iOS 平台对于 InAppWebView 中的一些特性可能存在一些限制。可能需要针对 iOS 平台进行特殊的配置,以确保嵌入的地图能够正确展示。

针对以上可能的原因,可以尝试采取以下措施进行解决:

1、升级 InAppWebView 版本:可以尝试升级 InAppWebView 到最新版本,查看是否有改进。

2、检查 JS 代码:可以仔细检查嵌入的 JS 代码是否正确,并且确保在 iOS 平台中也可以正确运行。

3、针对 iOS 平台进行特殊配置:可以查看 InAppWebView 的官方文档,了解 iOS 平台的限制,并进行相应的配置。可以尝试在 Info.plist 中添加必要的配置项,或者使用 InAppWebView 的特殊 API 进行配置。

如果以上措施仍然无法解决问题,可以尝试查看相关日志或者调试信息,查找更加详细的错误信息,以便更好地定位和解决问题。

参考GPT和自己的思路,这可能是由于iOS系统的CSP(Content Security Policy)导致的问题。CSP是一种用于限制页面中可执行脚本的安全策略。如果你的高德地图自定义样式中包含不符合CSP的内容,可能会导致iOS端无法加载。

为了解决这个问题,可以尝试以下步骤:
1 在您的HTML文档中添加以下meta标签以允许加载不符合CSP规则的内容:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline' *; script-src 'self' 'unsafe-inline' 'unsafe-eval' *; img-src 'self' data: *">


2 尝试在Webview中打开一个简单的HTML页面,以验证您的iOS设备是否允许加载不符合CSP规则的内容。如果您发现自定义样式加载正常,则可能需要进一步检查您的高德地图自定义样式文件。
3 检查您的高德地图自定义样式文件是否包含不符合CSP规则的内容。如果是这样,请尝试删除这些内容并重新加载页面。
希望这些步骤能够帮助您解决问题。

“Devil组”引证GPT后的撰写:

  • 问题与iOS处理web视图和嵌入式自定义样式的方式有关。iOS和Android处理web视图的方式存在一些差异,这有时会导致web内容的显示方式不一致。
  • 一个可能的解决方案是尝试用WKWebView而不是UIWebView。
    WKWebView是iOS推荐的webview,提供更好的性能和更高级的功能。
  • 另一个可能的解决方案是检查用于嵌入自定义样式的JavaScript代码中是否有任何错误。可能存在语法错误或其他问题,阻止自定义样式在iOS设备上正确显示。

或在应用程序的 Info.plist 文件中添加以下代码,以允许 In-App WebView 在 iOS 中加载自定义样式:

<key>NSAllowsArbitraryLoads</key>
<true/>
  

你好,可能是因为 iOS 端 WebView 默认开启了 Safari 浏览器的“智能跟踪预防”功能,导致网页中使用的部分资源无法加载。解决方法是在 WebView 加载时加入如下代码:

if (Platform.isIOS) {
  await controller.evaluateJavascript(
    'document.documentElement.style.webkitUserSelect="none";'
    'document.documentElement.style.webkitTouchCallout="none";'
    'document.documentElement.style.webkitTapHighlightColor="rgba(0,0,0,0)";'
    'window.addEventListener("message", (event) => {'
      'if (event.data && event.data.type === "setWebViewTheme") {'
        'var args = event.data.args;'
        'document.documentElement.style.setProperty("--page-bg", args.page_bg);'
        'document.documentElement.style.setProperty("--header-bg", args.header_bg);'
        'document.documentElement.style.setProperty("--header-color", args.header_color);'
        'document.documentElement.style.setProperty("--title-font-size", args.title_font_size);'
      '}'
    '}, false);',
  );
}


以上代码会先禁用一些 Safari 的默认功能,然后监听 message 事件,在收到“setWebViewTheme”消息时将自定义的样式应用到页面上。你需要根据自己的代码将以上代码片段整合到合适的位置,其中 controller 是 InAppWebView 的控制器,应该在初始化 WebView 时创建并传递给 InAppWebView。

注意,以上代码是基于 JavaScript 的,如果你的高德地图自定义样式是使用其他技术实现的,可能需要针对具体的技术进行修改。