WKWebView和JS交互

閱讀目錄

一、WKWebView的框架

二视卢、WKWebView的兩個(gè)代理WKNabigationDelegateWKUIDelegate

三、OC與JS的交互和JS調(diào)用OC方法的回調(diào) WKScriptMessageHandler

四杨幼、部分代碼,包括OCJS

一聂渊、WKWebView的框架

1.WKWebViewConfiguration:只讀差购,需在webView之前初始化
其中包括
WKProcessPool:進(jìn)程加載池,基本用不到
WKPreferences:webView的偏好設(shè)置汉嗽,如最小字體欲逃、是否允許JS等
WKUserContentController:這個(gè)主要管理和JS的交互了,下面會(huì)詳細(xì)講到
WKWebsiteDataStore:web的數(shù)據(jù)管理诊胞,清除緩存等暖夭,但是要注意這個(gè)ios9.0及以上才可以用

2.WKBackForwardList:只讀锹杈,管理WKWebView之前訪問(wèn)的網(wǎng)頁(yè)對(duì)象;對(duì)象類(lèi)WKBackForwardListItem就相當(dāng)于網(wǎng)頁(yè)迈着,包括標(biāo)題竭望,URL

3.WKFrameInfo:網(wǎng)頁(yè)的布局信息

4.WKNavigation:網(wǎng)頁(yè)的加載進(jìn)度信息,話(huà)是這么說(shuō),其實(shí)這個(gè)類(lèi)沒(méi)啥用裕菠,.h文件里啥都沒(méi)有咬清;最后還是要用estimatedProgress去算大概進(jìn)度

5.WKNavigationAction:網(wǎng)頁(yè)的導(dǎo)航變化信息

6.WKNavigationResponse:網(wǎng)頁(yè)導(dǎo)航變化返回的內(nèi)容

7.WKWindowFeatures:設(shè)置新加載的網(wǎng)頁(yè)窗口屬性,可以控制menuBar奴潘、statusBar旧烧、toolBar的可見(jiàn)度等

8.WKUserScript:腳本類(lèi),配合WKUserContentController往網(wǎng)頁(yè)里添加用戶(hù)腳本

9.WKSciptMessage:網(wǎng)頁(yè)調(diào)用客戶(hù)端傳過(guò)來(lái)的信息類(lèi)画髓,包括調(diào)用的方法名name掘剪、內(nèi)容body(任意類(lèi)型,只要雙方約定好怎么解開(kāi)就ok)

二、WKWebView的兩個(gè)代理WKNabigationDelegate奈虾、WKUIDelegate

1.WKNavigationDelegate加載過(guò)程監(jiān)控是否跳轉(zhuǎn)
加載過(guò)程監(jiān)控:

// 頁(yè)面開(kāi)始加載時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
// 當(dāng)內(nèi)容開(kāi)始返回時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation
// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
// 頁(yè)面加載失敗時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error

是否跳轉(zhuǎn):

//發(fā)送請(qǐng)求之前夺谁,設(shè)置是否跳轉(zhuǎn),在代碼塊`decisionHandler `中傳參即可肉微,具體查看`WKNavigationActionPolicy `枚舉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
//收到響應(yīng)后匾鸥,設(shè)置是否跳轉(zhuǎn),其他同上
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
//收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用,目前還不知道可以用來(lái)干嘛
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation

2.WKUIDelegate

//創(chuàng)建一個(gè)新的webView碉纳,這個(gè)主要是頁(yè)面想重開(kāi)一個(gè)webView使用勿负,注意不可使用當(dāng)前的webView,否則會(huì)異常劳曹,除非強(qiáng)制內(nèi)容還是在當(dāng)前頁(yè)面顯示
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
//web界面彈出的三種提示框
// 界面彈出警告框
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler
// 界面彈出確認(rèn)框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler
// 界面彈出輸入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler
三奴愉、OC與JS的交互和JS調(diào)用OC方法的回調(diào) WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
//JS調(diào)用OC方法成功后的回調(diào)
//這里通過(guò)message對(duì)象判斷要執(zhí)行的事件,以及傳過(guò)來(lái)的內(nèi)容铁孵,
  詳細(xì)看上面`WKScriptMessage`介紹
}
四躁劣、部分代碼,包括OCJS

OC:

1.WKWebView初始化

WKWebViewConfiguration *wkConfig = [[WKWebViewConfiguration alloc] init];
    wkConfig.userContentController = [[WKUserContentController alloc] init];
    _webView = [[WKWebView alloc] initWithFrame:self.view.bounds
                                  configuration:wkConfig];
    _webView.backgroundColor = [UIColor whiteColor];
    _webView.UIDelegate = self;
    _webView.navigationDelegate = self;

2.OC注冊(cè)方法給JS調(diào)用库菲、JS調(diào)用OC后的回調(diào)JS如何調(diào)用

OC注冊(cè)方法給JS調(diào)用:

//self為當(dāng)前對(duì)象觸發(fā)代理方法账忘,`methodName`為方法名(NSString型),JS那邊調(diào)用時(shí)需一樣
[_webView.configuration.userContentController addScriptMessageHandler:self name:methodName];

JS調(diào)用OC后的回調(diào):

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    /*message對(duì)象里我們主要會(huì)用到name和body
      name:JS調(diào)用OC時(shí)的方法名,與上面注冊(cè)時(shí)對(duì)應(yīng)
      body:JS傳過(guò)來(lái)的值熙宇,類(lèi)型根據(jù)JS的設(shè)置為準(zhǔn)鳖擒,兩邊商量著定就OK
    */
    if ([message.name isEqualToString:@"methodName"]) {
   //此處做相應(yīng)的響應(yīng)h5的操作
    }
}

JS調(diào)起OC:

function btnClick() {
    //methodName與上面OC注冊(cè)的對(duì)應(yīng),否則無(wú)效
    //參數(shù)可以為:null烫止、'Hello World !'蒋荚、['hello','world'],看需求
    window.webkit.messageHandlers.methodName.postMessage(參數(shù))
}

3.JS注冊(cè)方法給OC調(diào)用馆蠕、OC調(diào)用JS的方法

JS注冊(cè)方法給OC調(diào)用:

//aa期升、bb為參數(shù)惊奇,當(dāng)然也可以直接( )、(aa)
function helloWorld(aa,bb) {
    //此處為JS收到OC調(diào)用此方法后的處理
}

OC調(diào)用JS的方法

[_webView evaluateJavaScript:@"helloWorld('Hello','World')" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
   //調(diào)用JS方法的回調(diào)
   NSLog(@"%@ %@",response,error);
}];

ps:因?yàn)槭侵苯訉?xiě)在項(xiàng)目里了播赁,所以如果有需要會(huì)重新整理出來(lái)完整的JS和OC的代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颂郎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子容为,更是在濱河造成了極大的恐慌乓序,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坎背,死亡現(xiàn)場(chǎng)離奇詭異替劈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)得滤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)陨献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人懂更,你說(shuō)我怎么就攤上這事湿故。” “怎么了膜蛔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)脖阵。 經(jīng)常有香客問(wèn)我皂股,道長(zhǎng),這世上最難降的妖魔是什么命黔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任呜呐,我火速辦了婚禮,結(jié)果婚禮上悍募,老公的妹妹穿的比我還像新娘蘑辑。我一直安慰自己,他們只是感情好坠宴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布洋魂。 她就那樣靜靜地躺著,像睡著了一般喜鼓。 火紅的嫁衣襯著肌膚如雪副砍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天庄岖,我揣著相機(jī)與錄音豁翎,去河邊找鬼。 笑死隅忿,一個(gè)胖子當(dāng)著我的面吹牛心剥,可吹牛的內(nèi)容都是我干的邦尊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼优烧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝉揍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起匙隔,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疑苫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后纷责,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捍掺,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年再膳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挺勿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喂柒,死狀恐怖不瓶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灾杰,我是刑警寧澤蚊丐,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站艳吠,受9級(jí)特大地震影響麦备,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昭娩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一凛篙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栏渺,春花似錦呛梆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霎终,卻和暖如春融痛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背神僵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工雁刷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人保礼。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓沛励,卻偏偏與公主長(zhǎng)得像责语,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子目派,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • 開(kāi)發(fā)App的過(guò)程中坤候,常常會(huì)遇到在App內(nèi)部加載網(wǎng)頁(yè),通常用UIWebView加載企蹭。而這個(gè)自iOS2.0開(kāi)始使用的W...
    SunshineBrother閱讀 13,104評(píng)論 2 56
  • JS調(diào)用OC方法 oc中初始化WKWebView對(duì)象,進(jìn)行相應(yīng)的配置 JS中定義給oc傳參的方法,注意sendMe...
    流沙Var閱讀 422評(píng)論 0 2
  • IOS WKWebview 使用集錦 1白筹、alert textInput等UI交互解決方法 如果需要與在JS調(diào)用a...
    John_LS閱讀 16,977評(píng)論 3 35
  • 前言 關(guān)于UIWebView的介紹,相信看過(guò)上文的小伙伴們谅摄,已經(jīng)大概清楚了吧徒河,如果有問(wèn)題,歡迎提問(wèn)送漠。 本文是本系列...
    CoderLF閱讀 8,965評(píng)論 2 12
  • 越來(lái)越多的項(xiàng)目中使用Native和網(wǎng)頁(yè)的混合開(kāi)發(fā)顽照,這使得純客戶(hù)端工作大大減輕。隨著手機(jī)硬件的提升闽寡,軟件卡頓問(wèn)題也會(huì)...
    我是三人禾閱讀 517評(píng)論 0 2