1. 程式人生 > >WKWebView與JS互動詳情.

WKWebView與JS互動詳情.

上一篇博文《WebKit(展示Web介面)》講解了顯示Web頁面,這一篇博文將講解使用WKScriptMessageHandler完成JS互動。

在WKWebView中OC和JS互動也非常簡單,WebKit庫中有個代理WKScriptMessageHandler就是專門來做互動的。

1 WKScriptMessageHandler

1.1 WKScriptMessageHandler協議

WKScriptMessageHandler其實就是一個遵循的協議,它能讓網頁通過JS把訊息傳送給OC。其中協議方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

從協議中我們可以看出這裡使用了兩個類WKUserContentController和WKScriptMessage。WKUserContentController可以理解為排程器,WKScriptMessage則是攜帶的資料。

1.2 WKUserContentController

WKUserContentController有兩個核心方法,也是它的核心功能。

  1. - (void)addUserScript:(WKUserScript *)userScript;: js注入,即向網頁中注入我們的js方法,這是一個非常強大的功能,開發中要慎用。
  2. - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;:新增供js呼叫oc的橋樑。這裡的name對應WKScriptMessage中的name,多數情況下我們認為它就是方法名。

1.3 WKScriptMessage

WKScriptMessage就是js通知oc的資料。其中有兩個核心屬性用的很多。

  1. @property (nonatomic, readonly, copy) NSString *name; :對應- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;新增的name。
  2. @property (nonatomic, readonly, copy) id body;:攜帶的核心資料。

js呼叫時只需

  • 1

這裡的name就是我們新增的name,是不是感覺很爽,就是這麼簡單,下面我們就來具體實現。

2 JS呼叫OC

2.1 配置WKUserContentController

要想使用WKUserContentController為web頁面新增橋樑,只需配置到WKWebViewConfiguration即可。

下面改造webView方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.2 實現WKScriptMessageHandler

在當前頁面引入WKScriptMessageHandler,並實現WKScriptMessageHandler協議即可。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.3 改造index.html頁面

修改index.html的onClickButton()方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

這裡我們為了測試效果傳入了一個複雜的字典資料,而且字典中還有陣列。input.value代表使用者輸入的資料。

這裡使用了window.webkit.messageHandlers.jsCallOC.postMessage(dict);通知oc,jsCallOC這個屬性就是前面我們通過WKUserContentController注入的。

2.4 測試互動

我們在viewDidLoad使用index.html頁面完成測試。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

執行專案後,在頁面的輸入框中輸入相應資訊,點選確定按鈕。即可在xcode中看見相關列印資訊。

3 OC呼叫JS

3.1 OC通知JS

oc呼叫js就特別簡單了,只需WKWebView呼叫- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;方法即可。

在上面的列印資訊中,我們會發現我們還沒有實現jsCallOC:方法,接下來我們在jsCallOC:方法中實現通知JS,並將使用者輸入的資訊傳送給JS。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2 JS響應

OC將通知傳送給JS後,JS要響應這個ocCallJS方法。我們在index.html中的onClickButton()方法下新增ocCallJS方法。

  • 1
  • 2
  • 3
  • 4

執行專案,在輸入框輸入資訊後,點選確定按鈕,會發現輸入的資訊在輸入框下面顯示出來。如圖所示。

並在控制檯看見如下列印資訊。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4 WKUserScript JS注入

4.1 WKUserScript核心方法

在WebKit框架中,我們還可以預先新增JS方法,供其他人員呼叫。WKUserScript就是幫助我們完成JS注入的類,它能幫助我們在頁面填充前或js填充完成後呼叫。核心方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.2 WKUserScriptInjectionTime列舉

在WKUserScriptInjectionTime列舉中有兩個狀態。

  1. WKUserScriptInjectionTimeAtDocumentStart:js載入前執行。
  2. WKUserScriptInjectionTimeAtDocumentEnd:js載入後執行。

4.3 js注入

WKUserScript的執行需依託WKUserContentController,接下來我們就為WKWebView注入一個js執行完畢後執行的alert方法。

改造- (WKWebView *)webView方法。

相關推薦

WKWebViewJS互動詳情.

上一篇博文《WebKit(展示Web介面)》講解了顯示Web頁面,這一篇博文將講解使用WKScriptMessageHandler完成JS互動。在WKWebView中OC和JS互動也非常簡單,WebKit庫中有個代理WKScriptMessageHandler就是專門來做互動的。1 WKScriptMessa

Android筆記之 WebviewJs互動-詳情舉例

Android呼叫網頁自身Js 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 本地(asset)網頁androidcalljs.h

WKWebViewjs互動

    接手新的專案,直接就放棄了iOS8以下的使用者.想想也是醉了.那麼小白帶你怎麼玩轉WKWebView. 首先點進去看API,好到此結束了.那我下面就不用寫了.其實網上有很多相關的WEWebVi

WKWebView JS 互動簡單使用

通過調研,我決定使用WKWebView替換原來的UIWebView。 遇到的第一個問題就是WKWebView無法在我喜愛的xib上設定,通過翻牆搜尋資料,原來WKWebView沒有實現initWithCoder方法,自然也就找到了解決辦法: 自定義一個M

WKWebViewJS互動之實戰技巧介紹

前言 效果圖 通過本篇文章,至少可以學習到: OC如何給JS注入物件及JS如何給IOS傳送資料 JS呼叫alert、confirm、prompt時,不採用JS原生提示,而是使用iOS原生來實現 如何監聽web內容載入進度、是否載入完成 如何

Swift WKWebView(二):iOSjs互動

在上一篇中我們介紹了Swift下WKWebView的基本使用方法,下面總結一下iOS與js互動的實現,最終的頁面效果如下圖所示: 其中,js有關程式碼如下: function navButtonAction(name,age){

Swift 使用WKWebView 實現Swift JS 互動

功能一:刪除京東手機版https://m.jd.com/右上角的登陸按鈕 程式碼如下 import UIKit import WebKit class ViewController2: UIViewController,WKNavigationDelegate { @IBOutlet w

iOS 開發 Object-C和JavaScript互動詳解之OCJS互動WKWebView中使用

1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr

iOSjs互動(WebView+WKWebView)

需求:1點選js登入按鈕將使用者賬號和密碼傳給移動端             2將客戶端的token傳給html端 據我瞭解有以下幾種方法 1:webview的javascriptCore 2:webkit 3:url攔截 4:第三方庫 我用的是1和2

WKWebViewJS互動載入CSS樣式(Hybrid混合開發)

首先,我們需要準備一篇帶有互動指令碼的HTML <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

duilib CWebBrowser控制元件 cxxjs互動

轉自:http://blog.csdn.net/sunflover454/article/details/60873557(侵刪) C++和js相互呼叫是個有意思的事情。 一、js中呼叫C++函式。函式原型 [html]  view plain

iOSJS互動的4種方法

iOS與JS互動的方法: 1.攔截url(適用於UIWebView和WKWebView) 2.JavaScriptCore(只適用於UIWebView,iOS7+) 3.WKScriptMessageHandler(只適用於WKWebView,iOS8+) 4.WebViewJ

OCJS互動 初體會

第一篇部落格,有點小緊張、小期待,會不會有人看?有也好,沒有也罷,權當自己圖個樂兒,記錄近來學到的知識。閒話少說,進入正題! OC與JS互動的方式:1、使用UIWebView通過攔截Request完成JS調取OC,通過stringByEvaluatingJavaScriptFromString注入JS函式或

Android開發之Webview中原生JS互動

文章目錄 概述 使用場景 互動方式 Java呼叫JS程式碼 JS呼叫Java程式碼 總結 概述 由於手機硬體資源的快速提升,使得采用混合開發的可能性逐漸成為現實並且流行起來。Android開發中

WKWebViewH5互動的兩種方式

互動方式一:原生互動(以WKWebView為栗子) 1.原生呼叫H5方法 [wkWebView evaluateJavaScript:@"js方法名" completionHandler:^(id _Nullable response, NSError * _Nullable err

使用WebViewJavascriptBridge實現OCJS互動

  陳向陽哈  關注 2015.09.29 15:36* 最後編輯於 2015.10.13 09:44   字數 146

目前iOSJS互動的方法選擇比對

只是針對目前存在的互動方式做個比對。不會涉及任何實現。如需知道具體的使用。可自行baidu或者Google。 攔截協議 攔截協議是最簡單的互動方式,在Android端和iOS端直接攔截,可以統一web前端的程式碼。web前端通過在連結中帶上引數。比如: 88gongxiang:

OCJS互動之JavaScriptCore

JavaScriptCore初探 在iOS7之前,原生應用和Web應用之間很難通訊。如果你想在iOS裝置上渲染HTML或者執行JavaScript,你不得不使用UIWebView。iOS7引入了JavaScriptCore,功能更強大,使用更簡單。 ###JavaScriptCore

Android之webViewjs互動

一、java呼叫js操作: 1.佈局檔案: <WebView android:id="@+id/web" android:layout_width="match_parent" android:layout_height="mat

安卓混淆之後,androidjs互動異常原因

解決方案:需要js互動程式碼不被混淆掉,加入以下程式碼即可 -keepclassmembers class com.taohaohuo365.taohaohuo.activity.H5Activity$AndroidAndJSInterface { public *; } -keepcla