2017-06-12 70 views
1

我加载网页视图内的本地HTML页面中的IOS应用程序(使用Xamarin,但我不认为它改变任何东西)IOS - 在WKWebView CORS从本地HTML文件

这本地的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中启用它,是否可以使其工作?

回答

1

您可以将您的服务器用作代理服务器:它可以接收来自浏览器的请求,解析并将其转换为对远程服务器的请求。该通信不再受浏览器限制的影响。

另一种解决方案是使用message handler,但这需要访问由远程服务器运行的另一个项目来建立通信。

0

据我所知,如果您不更改服务器配置,WKWebview本身就没有解决方案。

但我有一个解决方案,即使它是一个疯狂的方式。我知道哈哈。

无论如何,我解决了这个问题,这是完全相同的问题。

首先, 我也想使用WKWebview,因为它的性能有所提高,并希望使用XHR来请求服务器API。这意味着我只想用JavaScript处理所有业务逻辑。

看看这个: WKWebview - >本地 - >的UIWebView - >本地 - > WKWebview

前提。

  1. 一个ViewController有一个WKWebview和一个UIWebview:当然,它的视图是WKWebview。 UIWebview是零大小的webview(不可见)。
  2. UIWebView中只处理的XmlHttpRequest(包括用于XHR最小JavaScript文件)

工作过程

  1. WKWebview发送requestHeader和数据(XHR)到纯
  2. 本机将接收到的数据以UIWebview
  3. UIWebview请求XHR
  4. UIWebview将响应数据发送到本机
  5. 本地发送响应数据WKWebview

通过这一解决方案,你并不需要依赖于本地代码或服务器配置。整个实施并不困难。你可以找到#1,2,4,5的示例代码。 虽然增加了一些附加步骤,但总响应时间没有延迟。

我测试了一切。我希望它能帮助你。