iOS與JS交互之WKWebView-WKUIDelegate協(xié)議

級(jí)別:★★☆☆☆
標(biāo)簽:「iOS與JS交互」「WKWebView與JS交互」「WKUIDelegate」
作者: Xs·H
審校: QiShare團(tuán)隊(duì)

先解釋下標(biāo)題:“iOS與JS交互”蚌斩。iOS指iOS原生代碼(文章只有OC示例)传透,JS指WEB前端(不單指JavaScript)招拙,交互指JS調(diào)用iOSiOS調(diào)用JS杰标。
作者將iOS與JS交互總結(jié)成了6種方式琉用,并將逐一介紹晶密。目錄如下:


本文是對(duì)使用WKWebView-協(xié)議攔截WKWebView-WKScriptMessageHandler協(xié)議實(shí)現(xiàn)iOSJS交互的補(bǔ)充瞬女。
因?yàn)?code>WKWebView的特性。JS在調(diào)用alert()榕茧、confirm()prompt()方法時(shí)沒(méi)有反應(yīng)垃沦。若要正常使用這三個(gè)方法,iOS需要實(shí)現(xiàn)WKUIDelegate中的三個(gè)方法模擬JS的這三個(gè)方法用押。

一肢簿、JS調(diào)用iOS:
  • 實(shí)現(xiàn)邏輯:點(diǎn)擊JS的alert按鈕、confirm按鈕和prompt按鈕只恨,iOS通過(guò)對(duì)應(yīng)的方法將數(shù)據(jù)展示出來(lái)译仗。

  • 實(shí)現(xiàn)效果:


    JS調(diào)用iOS實(shí)現(xiàn)效果
  • JS代碼:

//! alert按鈕
<button onclick = "showAlert()" style = "font-size: 18px;">alert(message)</button>

//! confirm按鈕
<button onclick = "showConfirm()" style = "font-size: 18px;">confirm(message)</button>

//! prompt按鈕
<button onclick = "showPrompt()" style = "font-size: 18px;">prompt(prompt, defaultText)</button>
//! 調(diào)用alert(message)
function showAlert() {
  alert("js_alertMessage");
}

//! 調(diào)用confirm(message)
  function showConfirm() {
    confirm("js_confirmMessage");
}

//! 調(diào)用prompt(prompt, defaultMessage)
  function showPrompt() {
    prompt("js_prompt", "js_prompt_defaultMessage");
}
  • iOS代碼:
//! 導(dǎo)入WebKit框架頭文件
#import <WebKit/WebKit.h>

//! WKWebViewWKUIDelegateController遵守WKUIDelegate協(xié)議
@interface WKWebViewWKUIDelegateController () <WKUIDelegate>
#pragma mark - WKUIDelegate

//! alert(message)
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        completionHandler();
    }];
    [alertController addAction:cancelAction];
    [self presentViewController:alertController animated:YES completion:nil];
}

//! confirm(message)
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Confirm" message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(NO);
    }];
    UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"確認(rèn)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(YES);
    }];
    [alertController addAction:cancelAction];
    [alertController addAction:confirmAction];
    [self presentViewController:alertController animated:YES completion:nil];
}

//! prompt(prompt, defaultText)
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler {
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:nil preferredStyle:UIAlertControllerStyleAlert];
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = defaultText;
    }];
    UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"確認(rèn)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(alertController.textFields[0].text);
    }];
    [alertController addAction:confirmAction];
    [self presentViewController:alertController animated:YES completion:nil];
}
  • 實(shí)現(xiàn)原理:
    1抬虽、JS調(diào)用alert()方法官觅、confirm()方法prompt()方法;
    2阐污、iOS實(shí)現(xiàn)WKUIDelegate協(xié)議里面的方法休涤,負(fù)責(zé)上述JS方法的響應(yīng);

PS1:JS與iOS方法的對(duì)應(yīng)關(guān)系如下:

JS方法 WKUIDelegate方法
alert(message) -webView: runJavaScriptAlertPanelWithMessage: initiatedByFrame:completionHandler:
confirm(message) -webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:
prompt(prompt, defaultText) -webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:

PS2:WKUIDelegate中的三個(gè)方法都有completionHandlerblock參數(shù),在iOS實(shí)現(xiàn)對(duì)應(yīng)的功能后必須調(diào)用此block完成回調(diào)功氨,否則會(huì)崩潰序苏。


二、iOS調(diào)用JS:

iOS調(diào)用JS方式與上篇文章一致捷凄,都是通過(guò)WKWebView的-evaluateJavaScript:completionHandler:方法來(lái)實(shí)現(xiàn)的忱详。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跺涤,隨后出現(xiàn)的幾起案子匈睁,更是在濱河造成了極大的恐慌,老刑警劉巖桶错,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航唆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡院刁,警方通過(guò)查閱死者的電腦和手機(jī)糯钙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)退腥,“玉大人任岸,你說(shuō)我怎么就攤上這事≡某妫” “怎么了演闭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)颓帝。 經(jīng)常有香客問(wèn)我米碰,道長(zhǎng),這世上最難降的妖魔是什么购城? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任吕座,我火速辦了婚禮,結(jié)果婚禮上瘪板,老公的妹妹穿的比我還像新娘吴趴。我一直安慰自己,他們只是感情好侮攀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布锣枝。 她就那樣靜靜地躺著,像睡著了一般兰英。 火紅的嫁衣襯著肌膚如雪撇叁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天畦贸,我揣著相機(jī)與錄音陨闹,去河邊找鬼楞捂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趋厉,可吹牛的內(nèi)容都是我干的寨闹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼君账,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼繁堡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乡数,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帖蔓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瞳脓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體塑娇,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年劫侧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埋酬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烧栋,死狀恐怖写妥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情审姓,我是刑警寧澤珍特,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站魔吐,受9級(jí)特大地震影響扎筒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酬姆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一嗜桌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辞色,春花似錦骨宠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至立美,卻和暖如春匿又,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悯辙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工琳省, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躲撰。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓针贬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拢蛋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桦他,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348