Ios 在evaluateJavaScript之后等待JS回调

Ios 在evaluateJavaScript之后等待JS回调,ios,swift,wkwebview,Ios,Swift,Wkwebview,我试图等待javascript回调,但是,swift回调在javascript回调之前被调用。如何等待JS回调 AppWebView.evaluateJavaScript("$('.loading-gif').removeClass('hide', function() { return true } );") { (Any, Error) in \\ .loading-gif successfully hided. } 你可以使用这个图书馆 在JS方面: bridge.registerHan

我试图等待javascript回调,但是,swift回调在javascript回调之前被调用。如何等待JS回调

AppWebView.evaluateJavaScript("$('.loading-gif').removeClass('hide', function() { return true } );") { (Any, Error) in
\\ .loading-gif successfully hided.
}
你可以使用这个图书馆

在JS方面:

bridge.registerHandler("show_loading", function(data, responseCallback) {
    $('.loading-gif').removeClass('hide', function() { 
     responseCallback(true) 
    } );
})
另一方面:

self.bridge.callHandler("show_loading",data:nil, handler: { (data:AnyObject!) in
            //do whatever you want...
        })
你可以使用这个图书馆

在JS方面:

bridge.registerHandler("show_loading", function(data, responseCallback) {
    $('.loading-gif').removeClass('hide', function() { 
     responseCallback(true) 
    } );
})
另一方面:

self.bridge.callHandler("show_loading",data:nil, handler: { (data:AnyObject!) in
            //do whatever you want...
        })

您可以通过javascript回调的回调通知本机iOS代码。如果在javascript中添加类似的内容:

window.webkit.messageHandlers.observe.postMessage(JSON.stringify({callback:'show_loading'}))


然后在本机端为WKWebView(安装在WKWebViewConfiguration上)设置WKUserContentController。您的userContentController.didReceiveScriptMessage处理程序将被Javascript端发送的JSON调用。

您可以通过Javascript回调通知本机iOS代码。如果在javascript中添加类似的内容:

window.webkit.messageHandlers.observe.postMessage(JSON.stringify({callback:'show_loading'}))


然后在本机端为WKWebView(安装在WKWebViewConfiguration上)设置WKUserContentController。您的userContentController.didReceiveScriptMessage处理程序将使用从Javascript端发送的JSON进行调用。

使用
evaluateJavaScript
无法做到这一点,因为一旦评估的Javascript返回,就会调用它的回调。这很可能是在异步调用完成之前

您需要在swift代码中注册一个消息处理程序,类似于

let script = WKUserScript(source: javascriptString, 
                          injectionTime: injectionTime, 
                          forMainFrameOnly: true)
userContentController.addUserScript(script)
webView.configuration.userContentController.addScriptMessageHandler(self, 
                                            name: "didShowLoading")
然后可以在Swift代码中定义委托方法

func userContentController(userContentController: WKUserContentController,
    didReceiveScriptMessage message: WKScriptMessage) {

    if message.name == "didShowLoading" {
        // do something
    }
}
最后,您可以发布来自javascript代码的消息

var script = "$('.loading-gif').removeClass('hide', function() {"
           + "  webkit.messageHandlers['didShowLoading'].postMessage('');"
           + "});"
webView.evaluateJavaScript(script)

使用
evaluateJavaScript
无法做到这一点,因为一旦被评估的Javascript返回,就会调用它的回调。这很可能是在异步调用完成之前

您需要在swift代码中注册一个消息处理程序,类似于

let script = WKUserScript(source: javascriptString, 
                          injectionTime: injectionTime, 
                          forMainFrameOnly: true)
userContentController.addUserScript(script)
webView.configuration.userContentController.addScriptMessageHandler(self, 
                                            name: "didShowLoading")
然后可以在Swift代码中定义委托方法

func userContentController(userContentController: WKUserContentController,
    didReceiveScriptMessage message: WKScriptMessage) {

    if message.name == "didShowLoading" {
        // do something
    }
}
最后,您可以发布来自javascript代码的消息

var script = "$('.loading-gif').removeClass('hide', function() {"
           + "  webkit.messageHandlers['didShowLoading'].postMessage('');"
           + "});"
webView.evaluateJavaScript(script)

javascriptString
script
(在底部代码段中)之间有什么区别?
javascriptString
script
(在底部代码段中)之间有什么区别?