如何在 WKWebview 中获取 JS 回调?

Posted

技术标签:

【中文标题】如何在 WKWebview 中获取 JS 回调?【英文标题】:How to get JS callBack in WKWebview? 【发布时间】:2016-09-20 09:11:28 【问题描述】:

我在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())

谁能帮忙?

【问题讨论】:

【参考方案1】:

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

初始化配置并添加 u 功能 [config.userContentController addScriptMessageHandler:delegate name:@"u function"];

当js调用函数时,你可以得到乐趣: userContentController:didReceiveScriptMessage:;

【讨论】:

不应该使用JavascriptCore,为什么会这样?【参考方案2】:

我有一个简单的方法来解决这个问题,你可以将函数覆盖到字符串,像这样

 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);
        );

    ;

在您的 Native 代码中,您可以获取回调并执行 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字符串函数中你不能对thisthis就是window

【讨论】:

以上是关于如何在 WKWebview 中获取 JS 回调?的主要内容,如果未能解决你的问题,请参考以下文章

[iOS]使用WKWebView遇到的问题总结

如何在 WKWebView 中加载的页面中的隐藏字段中获取值绑定

iOS获取WKWebView的高度

在 UICollectionView 单元格中单击 WKWebView 会导致未调用回调

如何使用 WKWebView 从 CacheDirectory 加载 css 和 js 文件?

访问 WKWebView 的 AVPictureInPictureController 的委托回调