IOS - 来自本地HTML文件的WKWebView中的CORS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS - 来自本地HTML文件的WKWebView中的CORS相关的知识,希望对你有一定的参考价值。
我在ios应用程序中的WebView中加载一个本地html页面(使用Xamarin,但我不认为它会改变任何东西)
此本地HTML页面向远程服务器发出ajax请求。
如果我使用UIWebView,一切正常,但当我尝试使用WKWebView时,它会失败。由于CORS失败,我尝试使用以下HTML源代码:
<html>
<body>
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<h1>Test AJAX Requests</h1>
<br />
<button type="button" onclick="javascript: TestAjaxRequest('https://www.google.com');">Test AJAX Google</button>
<button type="button" onclick="javascript: TestAjaxRequest('https://api.github.com');">Test AJAX Github</button>
<br />
<p id="result"></p>
<script type="text/javascript">
function TestAjaxRequest(url) {
$.ajax({
url: url,
success: function (result) {
$("#result").html('Success');
},
error: function (jqXHR, exception) {
$("#result").html('An error occured: ' + jqXHR.responseText + exception);
},
});
}
</script>
</body>
</html>
对google.com的调用失败,因为在此服务器上未启用CORS,而对api.github.com的调用有效,因为在其服务器上启用了CORS。
我不想在我的服务器上启用CORS,我只想在WKWebView中启用它,是否可以使其工作?
您可以将服务器用作代理:它可以从您的浏览器接收请求,解析它并将其转换为对远程服务器的请求。此通信将不再受浏览器限制的影响。
另一种解决方案是使用message handler,但这将涉及访问由远程服务器运行以建立通信的其他项目。
据我所知,如果不更改服务器配置,WKWebview本身就没有解决方案。
但我有一个解决方案,即使这是一个疯狂的方式。哈哈,我知道。
无论如何,我解决了这个问题,这是完全相同的问题。
首先,我还想使用WKWebview,因为它的性能提高,并希望使用XHR来请求服务器API。这意味着我只想用javascript处理所有业务逻辑。
看看这个:WKWebview - > Native - > UIWebview - > Native - > WKWebview
前提。
- ViewController有一个WKWebview和一个UIWebview:当然,它的视图是WKWebview。 UIWebview是零大小的webview(不可见)。
- UIWebview只处理XmlHttpRequest。(包括XHR的最小javascript文件)
工作程序
- WKWebview将requestHeader和数据(对于XHR)发送到Native
- Native将接收的数据发送到UIWebview
- UIWebview请求XHR
- UIWebview将响应数据发送到Native
- Native将响应数据发送到WKWebview
使用此解决方案,您无需依赖本机代码或服务器配置。整个实施并不困难。你可以找到#1,2,4,5的样本代码。虽然添加了一些额外的步骤,但总响应时间没有延迟。
我测试了所有这些。我希望它对你有所帮助。
以上是关于IOS - 来自本地HTML文件的WKWebView中的CORS的主要内容,如果未能解决你的问题,请参考以下文章
解压缩来自服务器的 zip 文件,而不在 ios swift 中本地保存,类似于 android 的操作?
来自本地 HTML 文件的 WebView Javascript 跨域