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