2017-06-12 66 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的示例代碼。 雖然增加了一些附加步驟,但總響應時間沒有延遲。

我測試了一切。我希望它能幫助你。