【问题标题】:How to get JS callBack in WKWebview?如何在 WKWebview 中获取 JS 回调?
【发布时间】: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())

谁能帮忙?

【问题讨论】:

    标签: ios wkwebview


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2019-05-03
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      相关资源
      最近更新 更多