如何使用GCDWebServer配置代理以支持跨源请求

时间:2018-03-18 16:24:22

标签: ios swift wkwebview gcdwebserver

我使用WKWebView的本地服务器在GCDWebServer上呈现本地网页内容,但由于Cookie位于后端,因此我有一个跨域请求。我怎样才能配置一个可以解决这个问题的代理。

注意:我已经尝试在GitHub上实现一些名为CorsProxy的东西,但它已经过时了,坦率地解决了我的问题,创建了一个代理。

我遇到了解决类似问题的答案,但是我在GCDWebServer上运行webView并且我不知道如何在这个特定的本地服务器上创建这样的代理?

有任何帮助吗?

这是我的代码:

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler {





var wkWebView: WKWebView!
var webServer = GCDWebServer()

var contentController = WKUserContentController()


func initWebServer() {
    let folderPath = Bundle.main.path(forResource: "www", ofType: nil)

    webServer.addGETHandler(forBasePath: "/", directoryPath: folderPath!, indexFilename: "index.html", cacheAge: 0, allowRangeRequests: true)

    webServer.start(withPort: 8080, bonjourName: "GCD Web Server")

}


public override func viewDidLoad() {
    super.viewDidLoad()

    initWebServer()

    let userScript = WKUserScript(source: "helloMsg2(\"boooo hoo hoo hoooo\")", injectionTime: .atDocumentEnd, forMainFrameOnly: true)

    contentController.addUserScript(userScript)
    contentController.add(self, name: "callback")

    let config = WKWebViewConfiguration()
    config.userContentController = contentController


    wkWebView = WKWebView(frame: view.bounds, configuration: config)
    wkWebView.scrollView.bounces = false
    wkWebView.uiDelegate = self
    wkWebView.navigationDelegate = self
    view.addSubview(wkWebView!)

    wkWebView.load(URLRequest(url: webServer.serverURL!))
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "callback" {

        print("message from javaScript is: \(message.body)")
    } else {
       print("message from javaScript is: \(message.body)")
    }
}

3 个答案:

答案 0 :(得分:0)

这可能对support CORS有帮助。 只需将fun pingConnection(session: Session) = session.select("SELECT 1") {}.first() 添加到响应标题中即可。

答案 1 :(得分:0)

由于此API不允许自定义标头,因此您需要滚动自己的-addGETHandlerForBasePath...实现以添加Access-Control-Allow-Origin: *标头。

请参见https://github.com/swisspol/GCDWebServer/blob/master/GCDWebServer/Core/GCDWebServer.m#L1015中的源代码。

答案 2 :(得分:0)

就去做:

GCDWebServerResponse * yourResponse = [GCDWebServerResponse new];
[yourResponse setValue:@"*" forAdditionalHeader:@"Access-Control-Allow-Origin"];