WKWebView JS和OC交互

1 ? WKScriptMessageHandler

? ? 1.1 WKScriptMessageHandler協(xié)議

? ?WKScriptMessageHandler 是一個(gè)遵循的協(xié)議楚堤,它能讓網(wǎng)頁(yè)通過(guò)JS把消息發(fā)送給 ?OC笆凌。其中協(xié)議方法。

/*! @abstract Invoked when a script message is received from a webpage.

@param userContentController The user content controller invoking the

delegate method.

@param message The script message received.

1.1.1 - (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message;(JS和OC交互的主要方法)

這個(gè)協(xié)議可以看出這里使用了兩個(gè)類(lèi)WKUserContentController和WKScriptMessage钦无。WKUserContentController 為web和OC的協(xié)調(diào)器,WKScriptMessage則是JS傳給OC攜帶的數(shù)據(jù)虽另。

1.2現(xiàn)在先說(shuō)WKUserContentController怎么使用和方法

? ? ?WKUserContentController有兩個(gè)核心方法丐巫,也是它的核心功能。

? ??1.2.1斤斧、 (void)addUserScript:(WKUserScript *)userScript;

? ? ? ? -------> js注入早抠,即向網(wǎng)頁(yè)中注入我們的js方法,這是一個(gè)非常強(qiáng)大的功能撬讽,開(kāi)發(fā)中要慎用蕊连。

? ? 1.2.2、(void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;

? ? ------->?添加供js調(diào)用oc的橋梁游昼。這里的name對(duì)應(yīng)WKScriptMessage中的name甘苍,我們可以認(rèn)為它就是方法名。(是通過(guò)獲取JS的方法名一樣的并取JS傳回來(lái)數(shù)據(jù)的標(biāo)識(shí)[self.userContentController addScriptMessageHandler:self name:@"JSCall"]酱床,注冊(cè)完了羊赵,在1.1.1獲取JS數(shù)據(jù),就可以通過(guò)[message.name isEqualToString:@"JSCall"] 判斷了)

1.3 WKScriptMessage

? ? ?WKScriptMessage就是js通知oc的數(shù)據(jù)扇谣。其中有兩個(gè)核心屬性用的很多昧捷。

? ? ?1.3.1?@property (nonatomic, readonly, copy) NSString *name;?

?? ? (void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;添加的name」拚看1.2.2

? ? 1.3.2 @property (nonatomic, readonly, copy) id body;:攜帶的核心數(shù)據(jù)靡挥。

? ?web H5那邊js調(diào)用時(shí)只需

? ?window.webkit.messageHandlers.name(OC添加的Name).postMessage({

? ?JS端要傳給OC端的數(shù)據(jù)

? ? })這里的name就是我們添加的name?下面我們就來(lái)具體實(shí)現(xiàn)。

? 2 JS調(diào)用OC

? ? ? 2.1 配置WKUserContentController

? ? ?使用WKUserContentController為web頁(yè)面添加橋梁鸯绿,只需配置到 WKWebViewConfiguration就行跋破。

- (WKWebView*)webView {

? if(_webView ==nil)?

? ?{

? ? // js配置

?? ? ? WKUserContentController*userContentController = [[WKUserContentControlleralloc] init]; ? ? ??

? ? [userContentController addScriptMessageHandler:selfname:@"JSCall"];

// WKWebView的配置

?WKWebViewConfiguration*configuration = [[WKWebViewConfigurationalloc] init]; ? ? ? ? ? ? configuration.userContentController = userContentController;

? ? ?// 顯示?

? ? ? ? WKWebView_webView = [[WKWebViewalloc] initWithFrame:self.view.frame ? configuration:configuration]; ?

? ? ? ? _webView.UIDelegate =self;

? ? ? ?// 設(shè)置WKUIDelegate代理

? ? ? ?[self.view addSubview:_webView];? ??

? ? ? ? ?}

? ? ? return_webView;

}

2.2 實(shí)現(xiàn)WKScriptMessageHandler

在當(dāng)前頁(yè)面引入WKScriptMessageHandler簸淀,并實(shí)現(xiàn)WKScriptMessageHandler協(xié)議。

- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message?

{

NSLog(@"方法名:%@", message.name);

NSLog(@"參數(shù):%@", message.body);

// 方法名

? NSString*methods = [NSStringstringWithFormat:@"%@:", message.name]; ??

? ? ?這里你可以根據(jù)需求寫(xiě)相關(guān)的方法OC實(shí)現(xiàn)

web端寫(xiě)法

? ? 使用了window.webkit.messageHandlers.JSCall.postMessage(dict);通知oc毒返,"JSCall"?這個(gè)屬性就是前面我們通過(guò)WKUserContentController注入的租幕。

3 ?OC調(diào)用JS

? ?3.1 OC通知JS

? ? 只需WKWebView調(diào)用

? ?- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;方法即可。

4 WKUserScript JS注入

4.1 WKUserScript核心方法

在WebKit框架中拧簸,我們還可以預(yù)先添加JS方法劲绪,供其他人員調(diào)用。WKUserScript就是幫助我們完成JS注入的類(lèi)盆赤,它能幫助我們?cè)陧?yè)面填充前或js填充完成后調(diào)用贾富。核心方法。

/*! @abstract Returns an initialized user script that can be added to a @link WKUserContentController @/link.

@param source The script source.

@param injectionTime When the script should be injected.

@param forMainFrameOnly Whether the script should be injected into all frames or just the main frame.

*/

- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;

4.2 WKUserScriptInjectionTime枚舉

? ? ?在WKUserScriptInjectionTime枚舉中有兩個(gè)狀態(tài)牺六。

? ? ? WKUserScriptInjectionTimeAtDocumentStart:js加載前執(zhí)行颤枪。

? ? ?WKUserScriptInjectionTimeAtDocumentEnd:js加載后執(zhí)行。

4.3 js注入

WKUserScript的運(yùn)行需依托WKUserContentController淑际,接下來(lái)我們就為WKWebView注入一個(gè)js執(zhí)行完畢后執(zhí)行的alert方法畏纲。

方法

- (WKWebView*)webView?

? ?{?

? ? if(_webView ==nil)

? ? ? {// js配置

? ?WKUserContentController*userContentController = [[WKUserContentControlleralloc] init];? ? ??

? ?[userContentController addScriptMessageHandler:selfname:@"JSCall"];// js注入,注入一個(gè)alert方法春缕,頁(yè)面加載完畢彈出一個(gè)對(duì)話(huà)框霍骄。

NSString*javaScriptSource =@"alert(\"WKUserScript注入js\");";

WKUserScript*userScript = [[WKUserScriptalloc] initWithSource:javaScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentEndforMainFrameOnly:YES];// forMainFrameOnly:NO(全局窗口),yes(只限主窗口)

[userContentController addUserScript:userScript];// WKWebView的配置WKWebViewConfiguration*configuration = [[WKWebViewConfigurationalloc] init];? ? ? ? configuration.userContentController = userContentController;// 顯示W(wǎng)KWebView_webView = [[WKWebViewalloc] initWithFrame:self.view.frame configuration:configuration];? ??

? ? [self.view addSubview:_webView];? ??

}

return_webView;

}

總結(jié):一路學(xué)習(xí)淡溯,一路分享,同時(shí)也感慨現(xiàn)在技術(shù)越來(lái)越好用簿训,越來(lái)越成熟咱娶。

參考的學(xué)習(xí)鏈接:http://www.reibang.com/p/ca7eb797c8a0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市强品,隨后出現(xiàn)的幾起案子膘侮,更是在濱河造成了極大的恐慌,老刑警劉巖的榛,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琼了,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夫晌,警方通過(guò)查閱死者的電腦和手機(jī)雕薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晓淀,“玉大人所袁,你說(shuō)我怎么就攤上這事⌒钻” “怎么了燥爷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵蜈亩,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我前翎,道長(zhǎng)稚配,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任港华,我火速辦了婚禮道川,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苹丸。我一直安慰自己愤惰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布赘理。 她就那樣靜靜地躺著宦言,像睡著了一般。 火紅的嫁衣襯著肌膚如雪商模。 梳的紋絲不亂的頭發(fā)上奠旺,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音施流,去河邊找鬼响疚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞪醋,可吹牛的內(nèi)容都是我干的忿晕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼银受,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼践盼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宾巍,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咕幻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顶霞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肄程,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年选浑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓝厌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲜侥,死狀恐怖褂始,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描函,我是刑警寧澤崎苗,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布狐粱,位于F島的核電站,受9級(jí)特大地震影響胆数,放射性物質(zhì)發(fā)生泄漏肌蜻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一必尼、第九天 我趴在偏房一處隱蔽的房頂上張望蒋搜。 院中可真熱鬧,春花似錦判莉、人聲如沸豆挽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帮哈。三九已至,卻和暖如春锰镀,著一層夾襖步出監(jiān)牢的瞬間娘侍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工泳炉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憾筏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓花鹅,卻偏偏與公主長(zhǎng)得像氧腰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刨肃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 關(guān)于UIWebView的介紹容贝,相信看過(guò)上文的小伙伴們,已經(jīng)大概清楚了吧之景,如果有問(wèn)題,歡迎提問(wèn)膏潮。 本文是本系列...
    CoderLF閱讀 8,943評(píng)論 2 12
  • 隨著H5技術(shù)的興起锻狗,在iOS開(kāi)發(fā)過(guò)程中,難免會(huì)遇到原生應(yīng)用需要和H5頁(yè)面交互的問(wèn)題焕参。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,060評(píng)論 1 8
  • 進(jìn)入15年以后轻纪,在我們天朝越來(lái)越流行混編!尤其是騰訊的 變態(tài)APP微信小程序一出叠纷,撐起了混編的半邊天刻帚! 廢話(huà)不多說(shuō)...
    白水灬煮一切閱讀 1,224評(píng)論 0 2
  • 雖然WKWebView是在A(yíng)pple的WWDC 2014隨iOS 8和OS X 10.10出來(lái)的,是為了解決UIW...
    winann閱讀 135,330評(píng)論 196 641
  • 第一章下界遇嫦娥 話(huà)說(shuō)天庭中有一元帥叫“天蓬”神稱(chēng)天蓬元帥素有第二戰(zhàn)神第二美男的美稱(chēng)涩嚣。天庭早朝:(玉帝)眾愛(ài)卿有事...
    飚車(chē)無(wú)照駕翹尾小青年閱讀 972評(píng)論 0 0