WKWebView的簡(jiǎn)單使用

WKWebView-iOS 8出現(xiàn)的,比UIWebView性能高出很多肚医!而且現(xiàn)在xcode也只支持到iOS8.0了庸疾,所以我們可以全面代替UIWebView了糯耍!

WKWebView是WebKit框架里的睡互,所以需要導(dǎo)入:#import <WebKit/WebKit.h>

初始化一個(gè)WKWebView

WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.reibang.com/users/ce9d64a894d8/latest_articles"]]];
[self.view addSubview:webView];

WKWebView代理協(xié)議:

  • WKUIDelegate

遵守協(xié)議:

webView.UIDelegate= self;

實(shí)現(xiàn)協(xié)議里的方法:

 /**
*web界面中有彈出警告框時(shí)調(diào)用
 *在HTML中調(diào)用了JS的alert()方法時(shí)届慈,就會(huì)回調(diào)此API
 *@param webView 實(shí)現(xiàn)該代理的webview
 *@param message 警告框中的內(nèi)容
 *@param frame 主窗口
 *@param completionHandler 警告框消失調(diào)用
 */
-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
                                                                             message:nil
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"確定"
                                                        style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler();
                                                      }]];
    
    [self presentViewController:alertController animated:YES completion:^{}];
    NSLog(@"%@",completionHandler);
}
/*
 確認(rèn)消息框Confirm
 */
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
                                                                             message:nil
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"確定"
                                                        style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler(YES);
                                                      }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"取消"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action){
                                                          completionHandler(NO);
                                                      }]];
    
    [self presentViewController:alertController animated:YES completion:^{}];
}
/*
 輸入框TextInput
 */
-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *result))completionHandler{
    
    completionHandler(@"Client Not handler");
}
  • WKNavigationDelegate

遵守協(xié)議:

webView.navigationDelegate = self;

實(shí)現(xiàn)協(xié)議方法:

/*
在發(fā)送請(qǐng)求之前,決定是否跳轉(zhuǎn)
 WKNavigationActionPolicyCancel,
 WKNavigationActionPolicyAllow,
 */
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
    /*
     WKNavigationTypeLinkActivated, href鏈接  0
     WKNavigationTypeFormSubmitted, 提交form  1
     WKNavigationTypeBackForward, back forward 2
     WKNavigationTypeReload,  刷新  3
     WKNavigationTypeFormResubmitted, 后退梳侨、前進(jìn),或重新加載  4
     WKNavigationTypeOther = -1,
     */
    NSLog(@"navigationType%ld",(long)navigationAction.navigationType);
    decisionHandler(WKNavigationActionPolicyAllow);
}
/**
 頁(yè)面開(kāi)始加載的時(shí)候調(diào)用
 @param webView    webView
 @param navigation 頁(yè)面的導(dǎo)航對(duì)象
 */
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
    [self.progressView setProgress:webView.estimatedProgress animated:YES];
}
/**
 在收到響應(yīng)后日丹,決定是否跳轉(zhuǎn)
 */
-(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
    decisionHandler(WKNavigationResponsePolicyAllow);
}
/**
 頁(yè)面開(kāi)始接收內(nèi)容時(shí)調(diào)用
 */
-(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{

}
/**
 頁(yè)面加載完成時(shí)調(diào)用
 */
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    self.navigationItem.title = webView.title;
    [self.progressView setProgress:webView.estimatedProgress animated:YES];
    
}
/**
 接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用
 */
-(void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{
    
}
/**
 頁(yè)面加載過(guò)程中失敗時(shí)調(diào)用
 */
-(void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{
    
}
/**
 頁(yè)面加載內(nèi)容失敗時(shí)調(diào)用
 */
-(void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error{
    
}

清除緩存

            NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
            NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
            [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes
                                                       modifiedSince:dateFrom               completionHandler:^{
                                                          
                                                       }];
  • WKScriptMessageHandler

遵守協(xié)議:

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    WKUserContentController *userCC = [[WKUserContentController alloc] init];
    config.userContentController = userCC;
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];

注:是否其中JS:webView.configuration.preferences.javaScriptEnabled = YES;
在該頁(yè)面注入JS函數(shù):[config.userContentController addScriptMessageHandler:self name:@"backMallHome"];

實(shí)現(xiàn)協(xié)議:實(shí)現(xiàn)js調(diào)用OC方法

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

    if ([message.name isEqualToString:@"backMallHome"]) {
        
    }
}

self.webView.backForwardList.currentItem.URL.absoluteString / backItem.URL.absoluteString / forwardItem.URL.absoluteString 等一些方法可以獲取到不同情況下的URL

JS與OC互調(diào)

  • JS調(diào)用OC:如果沒(méi)有參數(shù)走哺,不能寫(xiě)成postMessage();否則JS會(huì)報(bào)錯(cuò)哲虾!backMallHome為你注入的函數(shù)名丙躏。
window.webkit.messageHandlers.backMallHome.postMessage(['返回商城首頁(yè)']); 
  • OC調(diào)用JS:login()為JS函數(shù)
    [self.webView evaluateJavaScript:[NSString stringWithFormat:@"login(\"%@\")",[AppTool showLoginInfo].username] completionHandler:^(id _Nullable response, NSError * _Nullable error) {

    }];

JS兼容Android择示、iOS

//判斷訪問(wèn)終端
var browser={
versions:function(){

    var u = navigator.userAgent, 
    app = navigator.appVersion;
    return {
        trident: u.indexOf('Trident') > -1, //IE內(nèi)核
        presto: u.indexOf('Presto') > -1, //opera內(nèi)核
        webKit: u.indexOf('AppleWebKit') > -1, //蘋(píng)果、谷歌內(nèi)核
        gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐內(nèi)核
        mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否為移動(dòng)終端
        ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios終端
        android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android終端
        iPhone: u.indexOf('iPhone') > -1 , //是否為iPhone或者QQHD瀏覽器
        iPad: u.indexOf('iPad') > -1, //是否iPad
        webApp: u.indexOf('Safari') == -1, //是否web應(yīng)該程序晒旅,沒(méi)有頭部與底部
        weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
        qq: u.match(/\sQQ/i) == " qq" //是否QQ
    };
    }(),
    language:(navigator.browserLanguage || navigator.language).toLowerCase()
    }

//判斷是否移動(dòng)端
browser.versions.android
browser.versions.ios

模擬器調(diào)試H5頁(yè)面:

打開(kāi)Safari
斷點(diǎn)調(diào)試

感謝您的閱讀栅盲,希望對(duì)您有所幫助!歡迎任何形式的轉(zhuǎn)載敢朱,但請(qǐng)務(wù)必注明出處剪菱,尊重他人勞動(dòng)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拴签,一起剝皮案震驚了整個(gè)濱河市孝常,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚓哩,老刑警劉巖构灸,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岸梨,居然都是意外死亡喜颁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)曹阔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)半开,“玉大人,你說(shuō)我怎么就攤上這事赃份〖挪穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵抓韩,是天一觀的道長(zhǎng)纠永。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谒拴,這世上最難降的妖魔是什么尝江? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮英上,結(jié)果婚禮上炭序,老公的妹妹穿的比我還像新娘。我一直安慰自己苍日,他們只是感情好惭聂,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著易遣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫌佑。 梳的紋絲不亂的頭發(fā)上豆茫,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天侨歉,我揣著相機(jī)與錄音,去河邊找鬼揩魂。 笑死幽邓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火脉。 我是一名探鬼主播牵舵,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼倦挂!你這毒婦竟也來(lái)了畸颅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤方援,失蹤者是張志新(化名)和其女友劉穎没炒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犯戏,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送火,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了先匪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片种吸。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呀非,靈堂內(nèi)的尸體忽然破棺而出坚俗,到底是詐尸還是另有隱情,我是刑警寧澤姜钳,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布坦冠,位于F島的核電站,受9級(jí)特大地震影響哥桥,放射性物質(zhì)發(fā)生泄漏辙浑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一拟糕、第九天 我趴在偏房一處隱蔽的房頂上張望判呕。 院中可真熱鬧,春花似錦送滞、人聲如沸侠草。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)边涕。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間功蜓,已是汗流浹背园爷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留式撼,地道東北人童社。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像著隆,于是被迫代替她去往敵國(guó)和親扰楼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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

  • 最近公司的項(xiàng)目要加載幾個(gè)H5頁(yè)面(不用和js交互)美浦。先前我是用的是Webview弦赖,可是在調(diào)試的時(shí)候發(fā)現(xiàn)了問(wèn)題,加載...
    ZYiDa閱讀 655評(píng)論 0 1
  • 相比UIWebView 的優(yōu)點(diǎn) 占用內(nèi)存少 加載速度快 創(chuàng)建 2.添加加載進(jìn)度條該部分來(lái)源http://blog....
    codeing小牛閱讀 856評(píng)論 0 0
  • 雖然WKWebView是在Apple的WWDC 2014隨iOS 8和OS X 10.10出來(lái)的抵代,是為了解決UIW...
    winann閱讀 135,814評(píng)論 195 641
  • 前言 關(guān)于UIWebView的介紹腾节,相信看過(guò)上文的小伙伴們,已經(jīng)大概清楚了吧荤牍,如果有問(wèn)題案腺,歡迎提問(wèn)。 本文是本系列...
    CoderLF閱讀 8,974評(píng)論 2 12
  • 雨淅淅瀝瀝地下著,雨聲串成哀愁的曲調(diào),冰冷的音符在空曠的夜里回響,似小鎮(zhèn)在幽咽康吵。他渾濁的眼球里透著如夜一般濃稠的黑...
    冉染1999閱讀 132評(píng)論 0 5