【W(wǎng)KWebview填坑(三)】wkwebview和js傳值同步回調(diào)

和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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容