WKWebView的簡單應(yīng)用

????????蘋果公司在2014 WWDC上發(fā)布了iOS8,同時引入了WKWebView來替代傳統(tǒng)的UIWebView÷夂現(xiàn)在的產(chǎn)品也越來越多的使用到webview來實現(xiàn)app內(nèi)部復(fù)雜而又低動效的UI效果。今天我們就來看一下WKWebView的簡單應(yīng)用域庇。

WKWebView的優(yōu)勢:

在性能烁兰、穩(wěn)定性、功能方面有很大提升(最直觀的體現(xiàn)就是加載網(wǎng)頁是占用的內(nèi)存)转晰;

允許JavaScript的Nitro庫加載并使用(UIWebView中限制);

支持了更多的HTML5特性;

官方宣稱的高達60fps的滾動刷新率以及內(nèi)置手勢查邢;

將UIWebViewDelegate與UIWebView重構(gòu)成了14類與3個協(xié)議蔗崎。

????使用WKWebView我們首先引入#import <WebKit/WebKit.h>。下面直接上代碼扰藕。這是一個最簡單的webView的初始化缓苛。

一下是webview的navgationDelegate的各個方法。我們看一下他們的調(diào)用順序邓深。

//網(wǎng)頁加載之前未桥,是否允許開始加載網(wǎng)頁

- (void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler;

{

? ? //1

? ? decisionHandler(WKNavigationActionPolicyAllow);

}

//是否允許加載網(wǎng)頁接受到的收據(jù)

- (void)webView:(WKWebView*)webView decidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponse decisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler

{

? ? //5

? ? decisionHandler(WKNavigationResponsePolicyAllow);

}

//開始接收網(wǎng)頁數(shù)據(jù)

- (void)webView:(WKWebView*)webView didStartProvisionalNavigation:(null_unspecifiedWKNavigation*)navigation

{

? ? //2

}

//收到重定向請求

- (void)webView:(WKWebView*)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecifiedWKNavigation*)navigation

{

? ? //3

}

//加載失敗 (向網(wǎng)頁請求加載數(shù)據(jù)時)

- (void)webView:(WKWebView*)webView didFailProvisionalNavigation:(null_unspecifiedWKNavigation*)navigation withError:(NSError*)error

{

}

//開始加載網(wǎng)頁數(shù)據(jù)

- (void)webView:(WKWebView*)webView didCommitNavigation:(null_unspecifiedWKNavigation*)navigation

{

? ? //6

}

//加載結(jié)束

- (void)webView:(WKWebView*)webView didFinishNavigation:(null_unspecifiedWKNavigation*)navigation

{

? ? //7

}

//加載失敗 (接收網(wǎng)頁數(shù)據(jù)時)

- (void)webView:(WKWebView*)webView didFailNavigation:(null_unspecifiedWKNavigation*)navigation withError:(NSError*)error

{

}

//安全驗證

- (void)webView:(WKWebView*)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDispositiondisposition,NSURLCredential*_Nullablecredential))completionHandler

{

? ? //4 ? 這個方法不經(jīng)常用到,沒有過多的探究芥备。它是用于webview的數(shù)字證書安全驗證冬耿。

? ? completionHandler(NSURLSessionAuthChallengeUseCredential , challenge.proposedCredential);

}

在這里就遇到了wekwebview的第一個坑:如果我們使用了調(diào)用順序中的1和5方法,額哦們就必須實現(xiàn)decisionHandler block门躯。WKNavigationActionPolicy 和 是一個枚舉類型:.Allow //允許 ?.Cancel//取消 ?來控制是否允許網(wǎng)頁的跳轉(zhuǎn)和加載淆党。如果不實現(xiàn),程序會崩潰讶凉。


JS和WKWebView的數(shù)據(jù)交互染乌。

接下來我們看一下JS和WKWebView是如何實現(xiàn)數(shù)據(jù)交互的。

1懂讯、webView調(diào)用JS方法荷憋,很簡單一句話調(diào)用。

? ??[self.webView evaluateJavaScript:@"OCCallJSAction" completionHandler:^(id object, NSError * error) {

? ? }];

2褐望、JS調(diào)用webView的方法勒庄。首先我們用WKWebViewConfiguration的方法初始化webView。

????WKWebViewConfiguration? *configuration? = [[WKWebViewConfiguration alloc]init];

? ? WKUserContentController*userVC? ? ? ? ? ????= [[WKUserContentController alloc]init];

? ? [userVC addScriptMessageHandler:self? ? name:@"JSCallOCAction"];

? ? configuration.userContentController? ? = userVC;

? ? self.webView? ? ? ? ? ? = [[WKWebView alloc]initWithFrame:self.view.bounds

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? configuration:configuration];

? ? self.webView.navigationDelegate? ? ? ? =self;

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

? ? NSURLRequest*request? = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];

? ? [self.webViewloadRequest:request];

然后實現(xiàn)方法:

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

{

? ? //通過message.name判斷JS的響應(yīng)方法 來決定如何實現(xiàn)瘫里。參數(shù)在message.body实蔽。如果有多個方法可以使用定義多個name或者根據(jù)body區(qū)分實現(xiàn)。

}

注意:addScriptMessageHandler: ?name:方法會循環(huán)引用引發(fā)內(nèi)存泄漏谨读,需要我們特殊處理局装。當(dāng)使用該方法時,你會發(fā)現(xiàn)當(dāng)前控制器退出時劳殖,并不會觸發(fā)dealloc方法铐尚。我們需要調(diào)用userController的removeScriptMessageHandlerForName:方法。

? ? 此前使用在viewWillAppear中調(diào)用add方法哆姻,在viewWillDisappear中調(diào)用remove方法宣增,使控制器釋放。但是此時控制器并不會走dealloc方法矛缨。我們只做一個中間類WeakScriptMessageDelegate爹脾,來實現(xiàn)帖旨。

以下代碼可以直接寫到控制器的.h文件當(dāng)中:

@interface WeakScriptMessageDelegate: NSObject

@property (nonatomic, weak) id scriptDelegate;

- (instancetype)initWithDelegate:(id)scriptDelegate;

@end

以下代碼可以直接寫到控制器的.m文件當(dāng)中:

@implementationWeakScriptMessageDelegate

- (instancetype)initWithDelegate:(id)scriptDelegate {

? ? self= [superinit];

? ? if(self) {

? ? ? ? _scriptDelegate= scriptDelegate;

? ? }

? ? return self;

}

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

? ? [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];

}

@end

我們在調(diào)用add方法時使用:

[userVC addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] ?name:@"JSCallOCAction"];

在控制器的dealloc中使用:

[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"JSCallOCAction"];

OC捕獲H5的控件行為

? ?如果我們想要捕獲H5中的一些控件行為,我們需要設(shè)置WKWebView的UIDelegate灵妨。self.webView.UIDelegate = self;下面我們來看一下UIDelegate中經(jīng)常用到的幾個方法碉就。

//加載一個新的網(wǎng)頁

- (nullableWKWebView*)webView:(WKWebView*)webView createWebViewWithConfiguration:(WKWebViewConfiguration*)configuration forNavigationAction:(WKNavigationAction*)navigationAction windowFeatures:(WKWindowFeatures*)windowFeatures;

//關(guān)閉網(wǎng)頁 9.0以后可用

- (void)webViewDidClose:(WKWebView*)webView API_AVAILABLE(macosx(10.11), ios(9.0));

//捕獲H5中的Alert行為

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

//捕獲H5中的Confirm行為

- (void)webView:(WKWebView*)webView runJavaScriptConfirmPanelWithMessage:(NSString*)message initiatedByFrame:(WKFrameInfo*)frame completionHandler:(void(^)(BOOLresult))completionHandler;

//捕獲H5中的TextInput輸入框行為

- (void)webView:(WKWebView*)webView runJavaScriptTextInputPanelWithPrompt:(NSString*)prompt defaultText:(nullableNSString*)defaultText initiatedByFrame:(WKFrameInfo*)frame completionHandler:(void(^)(NSString*_Nullableresult))completionHandler;

????以上就是WKWebView的簡單應(yīng)用。如果有錯誤的地方歡迎在下方評論區(qū)指出闷串,不同意見大家一起討論下。萬分感謝筋量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烹吵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桨武,更是在濱河造成了極大的恐慌肋拔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呀酸,死亡現(xiàn)場離奇詭異凉蜂,居然都是意外死亡,警方通過查閱死者的電腦和手機性誉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門窿吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人错览,你說我怎么就攤上這事纫雁。” “怎么了倾哺?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵轧邪,是天一觀的道長。 經(jīng)常有香客問我羞海,道長忌愚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任却邓,我火速辦了婚禮硕糊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘申尤。我一直安慰自己癌幕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布昧穿。 她就那樣靜靜地躺著勺远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪时鸵。 梳的紋絲不亂的頭發(fā)上胶逢,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天厅瞎,我揣著相機與錄音,去河邊找鬼初坠。 笑死和簸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碟刺。 我是一名探鬼主播锁保,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼半沽!你這毒婦竟也來了爽柒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤者填,失蹤者是張志新(化名)和其女友劉穎浩村,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體占哟,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡心墅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了榨乎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎燥。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜜暑,靈堂內(nèi)的尸體忽然破棺而出刺覆,到底是詐尸還是另有隱情,我是刑警寧澤史煎,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布谦屑,位于F島的核電站,受9級特大地震影響篇梭,放射性物質(zhì)發(fā)生泄漏氢橙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一恬偷、第九天 我趴在偏房一處隱蔽的房頂上張望悍手。 院中可真熱鬧,春花似錦袍患、人聲如沸坦康。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滞欠。三九已至,卻和暖如春肆良,著一層夾襖步出監(jiān)牢的瞬間筛璧,已是汗流浹背逸绎。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夭谤,地道東北人棺牧。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像朗儒,于是被迫代替她去往敵國和親颊乘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,387評論 8 265
  • 前言: web頁面和app的直接的交互是很常見的東西醉锄,在ios8之前疲牵,用的是uiwebview,但是在ios8之后...
    qingchen91閱讀 2,952評論 6 25
  • 前言 關(guān)于UIWebView的介紹榆鼠,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧亥鸠,如果有問題妆够,歡迎提問。 本文是本系列...
    CoderLF閱讀 8,968評論 2 12
  • 一负蚊、WKWebView簡介 UIWebView自iOS2就有神妹,WKWebView從iOS8才有,毫無疑問WKWeb...
    慌莫染閱讀 4,096評論 0 4
  • 雖說人都是社會的動物 需要與人進行交流和溝通 需要各種社會關(guān)系 但是 現(xiàn)在似乎越來越多的人喜歡也習(xí)慣和自己相處 和...
    鶴舞vivi閱讀 119評論 0 0