iOS WKWebView與JS(HTML)的交互

在iOS的網(wǎng)頁開發(fā)中,時(shí)常遇到一些需求,需要和JS(HTML)進(jìn)行交互。
WKWebView與JS(HTML)的交互,其實(shí)就是互調(diào):

  • iOS調(diào)用JS
  • JS調(diào)用IOS
    其實(shí)就是約定協(xié)議和傳參的過程。

JS調(diào)用iOS

調(diào)用的方式有兩種:
1- 協(xié)議攔截+WKNavigationDelegate的配合實(shí)現(xiàn)
2- WKScriptMessageHandler實(shí)現(xiàn)

1- 協(xié)議攔截

步驟

  • 約定協(xié)議 jsPassIOSProcol
  • WKNavigationDelegate 攔截協(xié)議
WKNavigationDelegate.png
2- WKScriptMessageHandler實(shí)現(xiàn)

步驟

  • 約定協(xié)議 jsPassIOSProcol
  • 添加消息監(jiān)聽 addScriptMessageHandler
  • h5發(fā)送協(xié)議消息,iOS使用 WKScriptMessageHandler 接收消息
  • 取消消息監(jiān)聽 removeScriptMessageHandlerForName
WKScriptMessageHandler.png
對比兩種方式

h5代碼采取的方式不同:

   //js調(diào)用iOS
   function loadUrl(url) {
     window.location.href = url
  }
   function jsPassIOS() { //約定好協(xié)議
     var url = "jsPassIOSProcol://" + "jsPassIOSAtion" + "?" + "=params"
     loadUrl(url)
   }
   //js調(diào)用iOS
  function loadUrl(url) {
   window.location.href = url
  }
  function jsPassIOSProcol(param1,param2) {
    var url = "jsPassIOSProcol://" + param1 + "?" + param2
    loadUrl(url)
  }
   function jsPassIOS() { //發(fā)送jsPassIOSProcol消息
    window.webkit.messageHandlers.jsPassIOSProcol.postMessage("jsPassIOSAtion", "=params");
   }

常用的提示交互

alert
  • js端調(diào)用alert函數(shù)的時(shí)候,會觸發(fā)這個(gè)方法;
  • mesage: 拿到j(luò)s端傳遞的數(shù)據(jù);
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame
completionHandler:(void (^)(void))completionHandler {

}
confirm
  • js端調(diào)用confirm函數(shù)的時(shí)候,會觸發(fā)這個(gè)方法;
  • mesage: 拿到j(luò)s端傳遞的數(shù)據(jù);
  • 確認(rèn)/取消通過completionHandler回調(diào)給js端;
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {

}
prompt
  • js端調(diào)用prompt函數(shù)的時(shí)候,會觸發(fā)這個(gè)方法;
  • prompt: 拿到j(luò)s端傳遞的數(shù)據(jù);
  • 在原生將文本內(nèi)容,通過completionHandler回調(diào)給js端;
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt
    defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame
completionHandler:(void (^)(NSString * _Nullable result))completionHandler {

}
系統(tǒng)提示.png

iOS調(diào)用JS

調(diào)用JS.png

可以下載嘗試一下:小Demo

webView的縮放

有兩種方法:

  • 利用UIScrollViewDelegate方法
webView.scrollView.delegate = self
 func viewForZooming(in scrollView: UIScrollView) -> UIView? {
   return nil
 }

這種方法,有時(shí)候是不起作用的,而且在有輸入彈框的h5,彈框不會隨著鍵盤上下移動。

  • 往h5中,寫入適配的js代碼
 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
   //禁止縮放
   let javascript = "var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);"
   webView.evaluateJavaScript(javascript, completionHandler: nil)
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 前言 Web 頁面中的 JS 與 iOS Native 如何交互是每個(gè) iOS 猿必須掌握的技能。而說到 Nati...
    幽城88閱讀 2,334評論 1 8
  • 在項(xiàng)目開發(fā)中,我們常常遇到這種情況,一個(gè)功能性界面需要分享到其他平臺,或者是一個(gè)較復(fù)雜,原生框架不易實(shí)現(xiàn),需要經(jīng)常...
    zhangferry閱讀 4,589評論 7 25
  • 卡車轉(zhuǎn)眼間開始盤山繞行。剛拐了七八個(gè)彎,那個(gè)名叫良景瑜的“奶油小生”就忍不住干嘔起來。 “坐到風(fēng)口上...
    花星閱讀 381評論 1 2
  • 想當(dāng)年,金戈鐵馬,氣吞萬里如虎,是辛稼軒對建功立業(yè)時(shí)候的回憶;此誠只待成追憶,只是當(dāng)時(shí)已惘然,是李義山對于...
    詩酒尚趁年華閱讀 1,157評論 0 1
  • 對于任意一個(gè)類,都需要由加載它的類加載器和這個(gè)類本身一同確立其在Java虛擬機(jī)中的唯一性,每一個(gè)類加載器,都擁有一...
    oowl閱讀 817評論 0 2

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