2

我正在WKWebView使用 的本地服务器在 a 上呈现本地 Web 内容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)")
        }
    }
}
4

3 回答 3

1

这可能有助于支持 CORS。只需添加Access-Control-Allow-Origin: *到响应标头中。

于 2018-12-18T12:47:04.987 回答
1

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

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

于 2019-01-06T20:43:29.247 回答
0

做就是了:

GCDWebServerResponse * yourResponse = [GCDWebServerResponse new];
[yourResponse setValue:@"*" forAdditionalHeader:@"Access-Control-Allow-Origin"];
于 2021-05-14T02:56:25.733 回答