和h5聯(lián)調(diào)的時(shí)候遇到需要同步返回值得情況唱蒸,之前的匿名函數(shù)回調(diào)已經(jīng)不能實(shí)現(xiàn)該需求,所以想了另外一種方法實(shí)現(xiàn)該方法灸叼。
js和native的官方交互方法考慮了半天油宜,也沒發(fā)現(xiàn)好的方法,所以從另外一個(gè)角度出發(fā)解決同步回調(diào)的問題怜姿。
WKWebView默認(rèn)對(duì)JavaScript下alert類的方法(包括alert(),confirm(),prompt())做了攔截慎冤,實(shí)現(xiàn)WKWebView的三個(gè)代理方法可攔截此方法。因?yàn)閜rompt方法H5應(yīng)用的相對(duì)少沧卢,所以采用該方法進(jìn)行攔截處理蚁堤。
具體實(shí)現(xiàn)方法如下:
1.js實(shí)現(xiàn)方法如下:
var params = {"selector":"getAppVersion","params":[],"type":"app"};
var resultjson = prompt(JSON.stringify(params));
alert(resultjson);
ps:其中字典中selector代表方法名,params代表參數(shù)但狭,type用來標(biāo)記是否攔截做同步處理披诗。
2.ios實(shí)現(xiàn)方法
//runJavaScriptTextInputPanelWithPrompt prompt代理實(shí)現(xiàn)方法
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];