【WKWebview填坑(三)】wkwebview和js传值同步

2018-09-29  本文已影响384人  岳重亮

和h5联调的时候遇到需要同步返回值得情况,之前的匿名函数回调已经不能实现该需求,所以想了另外一种方法实现该方法。

js和native的官方交互方法考虑了半天,也没发现好的方法,所以从另外一个角度出发解决同步回调的问题。

WKWebView默认对JavaScript下alert类的方法(包括alert(),confirm(),prompt())做了拦截,实现WKWebView的三个代理方法可拦截此方法。因为prompt方法H5应用的相对少,所以采用该方法进行拦截处理。

具体实现方法如下:

1.js实现方法如下:

        var params = {"selector":"getAppVersion","params":[],"type":"app"};
        var resultjson = prompt(JSON.stringify(params));
        alert(resultjson);

ps:其中字典中selector代表方法名,params代表参数,type用来标记是否拦截做同步处理。

2.ios实现方法

//runJavaScriptTextInputPanelWithPrompt prompt代理实现方法

NSData *jsonData = [prompt dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData
                                                    options:NSJSONReadingMutableContainers
                                                      error:&err];
if (!err) {
    if([[dict objectForKey:@"type"]isEqualToString:@"app"]){
        
        NSString *result = [self JSCallOC:dict :YES];
        completionHandler(result);
        return;
    }
}

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    textField.text = defaultText;
}];
[alertController addAction:([UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    completionHandler(alertController.textFields[0].text?:@"");
}])];

[self presentViewController:alertController animated:YES completion:nil];
上一篇下一篇

猜你喜欢

热点阅读