閱讀目錄
一、WKWebView
的框架
二视卢、WKWebView
的兩個(gè)代理WKNabigationDelegate
、WKUIDelegate
三、OC與JS的交互和JS調(diào)用OC方法的回調(diào) WKScriptMessageHandler
四杨幼、部分代碼,包括OC
和JS
一聂渊、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`介紹
}
四躁劣、部分代碼,包括OC
和JS
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的代碼