WKWebView

簡介

UIWebView源于iOS2WKWebViewiOS8才有,毫無疑問WKWebView將逐步取代笨重的UIWebViewWKWebView只能用代碼創(chuàng)建,而且自身就支持了右滑返回手勢allowsBackForwardNavigationGestures和加載進度estimatedProgress等一些UIWebView不具備卻非常好用的屬性被去。通過簡單的測試即可發(fā)現(xiàn)UIWebView占用過多內(nèi)存,且內(nèi)存峰值更是夸張奖唯。WKWebView網(wǎng)頁加載速度也有提升惨缆,但是并不像內(nèi)存那樣提升那么多。
下面列舉一些其它的優(yōu)勢:

  • 在性能臭埋、穩(wěn)定性踪央、功能方面有很大提升(最直觀的體現(xiàn)就是加載網(wǎng)頁是占用的內(nèi)存,模擬器加載百度與開源中國網(wǎng)站時瓢阴,WKWebView占用23M畅蹂,而UIWebView占用85M);
  • 更多的支持HTML5的特性
  • 官方宣稱的高達60fps的滾動刷新率以及內(nèi)置手勢
    Safari相同的JavaScript引擎
  • UIWebViewDelegateUIWebView拆分成了14類與3個協(xié)議(官方文檔說明)
  • 另外用的比較多的荣恐,增加加載進度屬性:estimatedProgress

WKWebView的用法

  • 加載網(wǎng)頁方法與UIWebView相同:
// 網(wǎng)頁url
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
// 網(wǎng)絡(luò)請求
NSURLRequest *request =[NSURLRequest requestWithURL:url];
// 加載網(wǎng)頁
[self.webview loadRequest:request];
  • 加載文件
// 創(chuàng)建url(可以隨便從桌面拉張圖片)
NSURL *url = [NSURL fileURLWithPath:@"/Users/ios/Desktop/圖片/xxx.jpg"];
// 加載文件
[webView loadFileURL:url allowingReadAccessToURL:url];
  • 其余加載方法
-(WKNavigation *)loadRequest:(NSURLRequest *)request
-(WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
-(WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
  • 網(wǎng)頁刷新相關(guān)方法
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward;
-(WKNavigation *)goBack;
-(WKNavigation *)goForward;
-(WKNavigation *)reload;
-(WKNavigation *)reloadFromOrigin; // 增加的函數(shù)
-(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item; // 增加的函數(shù)
-(void)stopLoading;

reloadFromOrigin會比較網(wǎng)絡(luò)數(shù)據(jù)是否有變化液斜,沒有變化則使用緩存,否則從新請求叠穆。
goToBackForwardListItem:比向前向后更強大少漆,可以跳轉(zhuǎn)到某個指定歷史頁面

常用屬性

allowsBackForwardNavigationGestures:BOOL類型,是否允許左右劃手勢導(dǎo)航硼被,默認不允許
estimatedProgress:加載進度示损,取值范圍0~1
title:頁面title
scrollView.scrollEnabled:是否允許上下滾動,默認允許
backForwardList:WKBackForwardList類型嚷硫,訪問歷史列表检访,可以通過前進后退按鈕訪問,或者通過goToBackForwardListItem函數(shù)跳到指定頁面

相關(guān)代理協(xié)議

幾個常用代理協(xié)議:

(1)WKNavigationDelegate

最常用仔掸,和UIWebViewDelegate功能類似脆贵,追蹤加載過程,有是否允許加載起暮、開始加載卖氨、加載完成、加載失敗负懦。下面會對方法做簡單的說明筒捺,并用數(shù)字標出調(diào)用的先后次序:

// 接收到服務(wù)器跳轉(zhuǎn)請求之后調(diào)用 (服務(wù)器端redirect),不一定調(diào)用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation; 

// 3 在收到服務(wù)器的響應(yīng)頭纸厉,根據(jù)response相關(guān)信息系吭,決定是否跳轉(zhuǎn)。decisionHandler必須調(diào)用残腌,來決定是否跳轉(zhuǎn)村斟,參數(shù)WKNavigationActionPolicyCancel取消跳轉(zhuǎn)贫导,WKNavigationActionPolicyAllow允許跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;

// 1 在發(fā)送請求之前,決定是否跳轉(zhuǎn) 
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

追蹤加載過程方法:

// 2 頁面開始加載
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;

// 4 開始獲取到網(wǎng)頁內(nèi)容時返回
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;

// 5 頁面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;

// 頁面加載失敗時調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

(2)WKUIDelegate
UI界面相關(guān)蟆盹,原生控件支持孩灯,三種提示框:輸入、確認逾滥、警告峰档。首先將web提示框攔截然后再做處理。

// 創(chuàng)建一個新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;

// 輸入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;

// 確認框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;

// 警告框
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;

與JS交互

  • (1)WKWebView加載JS
//JS文件路徑
NSString *jsPath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
//讀取JS文件內(nèi)容
NSString *jsContent = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil];
//創(chuàng)建用戶腳本對象寨昙,
//WKUserScriptInjectionTimeAtDocumentStart :HTML文檔創(chuàng)建后讥巡,完成加載前注入,類似于<head>中
//WKUserScriptInjectionTimeAtDocumentEnd :HTML文件完成加載后注入,類似于<body>中
WKUserScript *script = [[WKUserScript alloc] initWithSource:jsContent injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
//添加用戶腳本
[webView.configuration.userContentController addUserScript:script];
  • (2)WKWebView執(zhí)行JS方法
//執(zhí)行JS方法
[webView evaluateJavaScript:@"test()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
    //result為執(zhí)行js方法的返回值
    if(error){
        NSLog(@"Success");
    }else{
        NSLog(@"Fail");
    }
}];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舔哪,一起剝皮案震驚了整個濱河市欢顷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捉蚤,老刑警劉巖抬驴,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缆巧,居然都是意外死亡布持,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門陕悬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來题暖,“玉大人,你說我怎么就攤上這事捉超‰事保” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵狂秦,是天一觀的道長灌侣。 經(jīng)常有香客問我推捐,道長裂问,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任牛柒,我火速辦了婚禮堪簿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皮壁。我一直安慰自己椭更,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布蛾魄。 她就那樣靜靜地躺著虑瀑,像睡著了一般湿滓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舌狗,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天叽奥,我揣著相機與錄音,去河邊找鬼痛侍。 笑死朝氓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的主届。 我是一名探鬼主播赵哲,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼君丁!你這毒婦竟也來了枫夺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绘闷,失蹤者是張志新(化名)和其女友劉穎筷屡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體簸喂,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡毙死,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喻鳄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扼倘。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖除呵,靈堂內(nèi)的尸體忽然破棺而出再菊,到底是詐尸還是另有隱情,我是刑警寧澤颜曾,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布纠拔,位于F島的核電站,受9級特大地震影響泛豪,放射性物質(zhì)發(fā)生泄漏稠诲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一诡曙、第九天 我趴在偏房一處隱蔽的房頂上張望臀叙。 院中可真熱鬧,春花似錦价卤、人聲如沸劝萤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽床嫌。三九已至跨释,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厌处,已是汗流浹背煤傍。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工帝际, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留持痰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓弟断,卻偏偏與公主長得像洒敏,于是被迫代替她去往敵國和親龄恋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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