和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];