WKWebview [警告] [已阻止] https://www.myurl.com 的页面不允许显示来自 mycustomscheme://?path=somepath 的不安全内容

WKWebview [Warning] [blocked] The page at https://www.myurl.com was not allowed to display insecure content from mycustomscheme://?path=somepath

我最近将我的 UIWebview 替换为我的混合应用程序中的 WKWebview。我正在使用自定义方案从应用程序的本机部分加载图像,正如 Apple 在此处推荐的那样: https://developer.apple.com/videos/play/wwdc2017/220/

我正在从看起来像 mycustomscheme://?path=somepath

的 url 加载图像

我添加了 Content-Security-Policy header 以允许混合内容,看起来像这样(不相关的部分已删除):

Content-Security-Policy: default-src 'self' www.myurl.com ; img-src 'self' mycustomscheme: ; script-src 'self' 'unsafe-inline' 'unsafe-eval' ; report-uri https://www.myreporturl.com/

这适用于大多数设备,并允许对 mycustomscheme 的请求通过,如果有任何内容被阻止,则向 myreporturl 报告。但是,在某些设备上,自定义请求会因以下错误而被阻止: [Warning] [blocked] The page at https://www.myurl.com was not allowed to display insecure content from mycustomscheme://?path=somepath 并且没有报告发送到 myreporturl,就好像根本没有加载 header。

我已确认 header 确实已发送,并且有问题的设备是 运行 最新的 iOS (12.1.4)。

任何关于如何防止我的自定义请求被阻止的建议将不胜感激!

原因: 自 iOS 9 起,iOS 将仅允许您的应用程序与默认实施最佳安全实践的服务器通信。必须在 Info.plist 中设置值才能与不安全的服务器进行通信。

解决方案:在您的info.plist中添加以下代码以信任您的域。

<key>NSAppTransportSecurity</key>
 <dict>
 <key>NSExceptionDomains</key>
 <dict>
  <key>www.myurl.com</key>
  <dict>       
   <key>NSExceptionRequiresForwardSecrecy</key>
   <false/>
   <key>NSExceptionAllowsInsecureHTTPLoads</key>
   <true/>
   <key>NSIncludesSubdomains</key>
   <true/>
 </dict>
</dict>

试试这个:

在您的 info.plist 文件中添加以下行:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>mycustomscheme</string>
</array>

确保将 mycustomscheme 更改为您自己的方案。

尝试以下加载图像策略:

img-src 'self' 'unsafe-inline' 'unsafe-eval' data: http: https: mycustomscheme: filesystem: file:;

它的 https 和 http 问题请确保您的所有内容都是 https:。 在彼此内部使用多个网站资源将其混合在一起。 尽量不要做 CORS。