Ios 如何在WKWebview中获取JS回调?

Ios 如何在WKWebview中获取JS回调?,ios,wkwebview,Ios,Wkwebview,我正在iOS中使用UIWebView,并与js通信。我使用JSContext获取以下js回调: public typealias jsBridgeFuncAlias = (JSValue)->Void @objc protocol WebViewJSExport:JSExport { var call:jsBridgeFuncAlias?{get} } class SAJavaScriptBridge:NSObject,WebViewJSExport{ public var call: j

我正在iOS中使用
UIWebView
,并与js通信。我使用
JSContext
获取以下js回调:

public typealias jsBridgeFuncAlias = (JSValue)->Void
@objc
protocol WebViewJSExport:JSExport {
var call:jsBridgeFuncAlias?{get}
}
class SAJavaScriptBridge:NSObject,WebViewJSExport{
public var call: jsBridgeFuncAlias?
public init(context:JSContext){
    super.init()
    context.setObject(self, forKeyedSubscript:kBridgeName as (NSCopying & NSObjectProtocol)!)
    self.call = { [unowned self](block:JSValue) in
        self.callNativeMethod(block:block )
    }
}

func callNativeMethod(block:JSValue){   
     block.call(withArguments:nil)  //execute the js callback block in ios native
}
但在迁移到
WKWebView
后,我无法使用以下代码获取js回调块:

window.webkit.messageHandlers.WKWebView.postMessage(function())
有人能帮忙吗?

试试这个: window.webkit.messageHandlers.ur function.postMessage(ur对象); 当你使用wkwebview时,你不应该使用javascripCore

init config和add u函数 [config.userContentController addScriptMessageHandler:委托名称:@“u函数”]

当js调用该函数时,您可以获得乐趣:
userContentController:didReceiveScriptMessage:

我有一个简单的方法来解决这个问题,您可以将函数覆盖到字符串,如下所示

 const person = {
        firstName: "John",
        lastName: "Doe",
        age: 50,
        eyeColor: "blue",
    };

    function postMessage(message, callBack) {
        message.callBack = callBack.toString();
        window.webkit.messageHandlers.Native.postMessage(message);
    }


    document.getElementById("li1").onclick = function () {

        postMessage(person, function (args) {
            console.log('call back is invoked' );
            console.log(args);
        });

    };
在本机代码中,可以获取回调并执行js字符串

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {

    if ([message.name isEqualToString:@"Native"]) {

        NSString *callBack = message.body[@"callBack"]; //get callBack
        NSDictionary *dict = @{
            @"key1": @"value1",
            @"key2": @"value2
        }; 

        id data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
        NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
        [_webView evaluateJavaScript:[NSString stringWithFormat:@"(%@)(%@)", callBack, jsonString] completionHandler:^(id _Nullable jsData, NSError * _Nullable error) {

        }];
    }
}

但是有一个小问题,你不能在js字符串函数中正确使用
这个
这个
窗口

不应该使用JavascriptCore,为什么?