美文网首页
【WKWebview填坑(三)】wkwebview和js传值同步

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

作者: 岳重亮 | 来源:发表于2018-09-29 15:57 被阅读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];
    

    相关文章

      网友评论

          本文标题:【WKWebview填坑(三)】wkwebview和js传值同步

          本文链接:https://www.haomeiwen.com/subject/wvqboftx.html