WKWebview與JavaScript 交互(一)交互本地html

印言

最近接到一個(gè)需求:監(jiān)聽網(wǎng)頁(yè)的按鈕的點(diǎn)擊事件,并且網(wǎng)頁(yè)不是我們招呼一聲對(duì)方就能改的非洲。那么一切的故事從這里開始了。正文部分主要圍繞監(jiān)聽網(wǎng)頁(yè)的事件為主線。

正文

WKWebView加載本地html頁(yè)面拐纱,
搭建UI做準(zhǔn)備工作。

NSString *path = [[NSBundle mainBundle] pathForResource:@"oc&js.html" ofType:nil];
[_wkWeb loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];

html和oc各創(chuàng)建兩個(gè)按鈕哥倔,倆個(gè)按鈕分別測(cè)試無(wú)參數(shù)和有參數(shù)消息的傳遞秸架。

<h2>是H5按鈕</h2>
<button type="button" onclick="js2oc1()">js調(diào)用oc的按鈕1</button>
<button type="button" onclick="js2oc2('Gavin','18')">js調(diào)用oc的按鈕2</button>
<!--    用于顯示oc點(diǎn)擊事件的結(jié)果    -->
<h1 id=labelId>label</h1>
// OC的按鈕
_button1 = [[UIButton alloc] initWithFrame:CGRectMake(100, self.view.bounds.size.height/2 + 100, 200,40)];
[_button1 setTitle:@"oc2js無(wú)參" forState:UIControlStateNormal];
_button1.backgroundColor = [UIColor grayColor];
[_button1 setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_button1 addTarget:self action:@selector(button1Click:)forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_button1];
    
_button2 = [[UIButton alloc]initWithFrame:CGRectMake(100,self.view.bounds.size.height/2 + 150, 200,40)];
[_button2 setTitle:@"oc2js有參"forState:UIControlStateNormal];
_button2.backgroundColor = [UIColor grayColor];
[_button2 setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_button2 addTarget:self action:@selector(button2Click:)forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_button2];

1. JS調(diào)用OC方法

JS按鈕綁定的函數(shù)內(nèi)給OC發(fā)送消息window.webkit.messageHandlers.這個(gè)位置是消息名稱.postMessage();,消息名稱在oc里注冊(cè)js消息的時(shí)候用到咆蒿。具體如下:

// JS給OC發(fā)送消息
function js2oc1() {
    window.webkit.messageHandlers.noParamsFunction.postMessage('我是js方法傳過(guò)來(lái)的數(shù)據(jù)');
}
function js2oc2(x,y) {
    window.webkit.messageHandlers.haveParamsFunction.postMessage({name:x,age:y});
}

WKWebView 需要遵守WKScriptMessageHandler協(xié)議东抹,并注冊(cè)JS消息:

WKUserContentController *_userContentController = [[WKUserContentController alloc] init];
// 遵守WKScriptMessageHandler協(xié)議。注冊(cè)JS消息沃测,name必須JS發(fā)送消息時(shí)的名字對(duì)應(yīng)
[_userContentController addScriptMessageHandler:self name:@"noParamsFunction"];
[_userContentController addScriptMessageHandler:self name:@"haveParamsFunction"];
    
WKWebViewConfiguration *_configuration = [[WKWebViewConfiguration alloc] init];
_configuration.userContentController = _userContentController;
    
_wkWeb = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width,self.view.bounds.size.height/2 - 20) configuration:_configuration];

WKScriptMessageHandler協(xié)議只有一個(gè)方法:

@protocol WKScriptMessageHandler <NSObject>

@required

/*! @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.
 */
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;

@end

實(shí)現(xiàn)該方法。方法功能就是接受JS消息蒂破。

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    // WKScriptMessage 類的name屬性是消息名稱馏谨,body是發(fā)送的數(shù)據(jù)
    NSLog(@"message.name:%@", message.name);
    NSLog(@"message.body:%@", message.body);
}

寫了這么多我們運(yùn)行一遍看效果:

1圖-兩個(gè)按鈕分別發(fā)送的消息.png

2. OC調(diào)用JS函數(shù)

WKWebView 有個(gè)方法- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;可以實(shí)現(xiàn)執(zhí)行JS代碼,原理比較像html頁(yè)面注入代碼附迷。這方法調(diào)用一般在頁(yè)面加載完成后惧互。如果不是寫在按鈕點(diǎn)擊事件內(nèi)哎媚,你可以選在在WKWebView的WKNavigationDelegate協(xié)議代理方法- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;內(nèi)調(diào)用。

貼上剛加載完的頁(yè)面做對(duì)比壹哺。白色背景的上半頁(yè)面是html區(qū)域抄伍,灰色背景的下半頁(yè)面是OC控件。下面的OC按鈕被點(diǎn)擊后html區(qū)域的label字樣會(huì)改變管宵。


2圖-加載完成的頁(yè)面

按鈕點(diǎn)擊事件內(nèi)調(diào)用:

- (void)button1Click:(UIButton *)button {
    // OC給JS發(fā)送消息
    [_wkWeb evaluateJavaScript:@"oc2js1()" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
        NSLog(@"error %@", error);
    }];
}
3圖-OC第一個(gè)按鈕點(diǎn)擊后
- (void)button2Click:(UIButton *)button {
    // OC給JS發(fā)送消息
    [_wkWeb evaluateJavaScript:@"oc2js2('你','好')" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
        NSLog(@"error %@", error);
    }];
}
4圖-OC第二個(gè)按鈕點(diǎn)擊后

demo工程可以到我的Github下載截珍。

總結(jié)

我們的目的想監(jiān)聽遠(yuǎn)程網(wǎng)頁(yè)按鈕點(diǎn)擊事件到這里還是不能實(shí)現(xiàn)。別人不會(huì)在自己的網(wǎng)頁(yè)JS代碼中給你添加window.webkit.messageHandlers.(messagename).postMessage讓你調(diào)用箩朴。所以在下一章中繼續(xù)岗喉。

WKWebview與JavaScript 交互(二)監(jiān)聽遠(yuǎn)程網(wǎng)頁(yè)點(diǎn)擊事件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炸庞,隨后出現(xiàn)的幾起案子钱床,更是在濱河造成了極大的恐慌,老刑警劉巖埠居,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查牌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滥壕,警方通過(guò)查閱死者的電腦和手機(jī)纸颜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绎橘,“玉大人胁孙,你說(shuō)我怎么就攤上這事〕屏郏” “怎么了涮较?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)冈止。 經(jīng)常有香客問(wèn)我狂票,道長(zhǎng),這世上最難降的妖魔是什么熙暴? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任苫亦,我火速辦了婚禮,結(jié)果婚禮上怨咪,老公的妹妹穿的比我還像新娘屋剑。我一直安慰自己,他們只是感情好诗眨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布唉匾。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巍膘。 梳的紋絲不亂的頭發(fā)上厂财,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音峡懈,去河邊找鬼璃饱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肪康,可吹牛的內(nèi)容都是我干的荚恶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼磷支,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谒撼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雾狈,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤廓潜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后善榛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辩蛋,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年移盆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悼院。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡味滞,死狀恐怖樱蛤,靈堂內(nèi)的尸體忽然破棺而出钮呀,到底是詐尸還是另有隱情剑鞍,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布爽醋,位于F島的核電站蚁署,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蚂四。R本人自食惡果不足惜光戈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遂赠。 院中可真熱鬧久妆,春花似錦、人聲如沸跷睦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烂琴,卻和暖如春爹殊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奸绷。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工梗夸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人号醉。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓反症,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扣癣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惰帽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,321評(píng)論 8 265
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_x閱讀 15,968評(píng)論 3 119
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 從二零一六年九月三號(hào)踏進(jìn)桂林醫(yī)學(xué)院到今天二零一六年十月三十一號(hào)已經(jīng)接近兩個(gè)月父虑。 剛從高考的戰(zhàn)場(chǎng)懵懵懂懂地走進(jìn)大學(xué)该酗,...
    果子醬呀閱讀 345評(píng)論 0 2
  • 頭疼,流涕士嚎,四肢無(wú)力呜魄,嗓子干疼------我到底是感冒了。唉莱衩,我真是關(guān)鍵時(shí)刻掉鏈子爵嗅。馬上要進(jìn)行月考了,感覺(jué)有太...
    娜么幸運(yùn)閱讀 433評(píng)論 0 2