WebView

一、WebView

WebView就是一個內(nèi)嵌瀏覽器控件,在iOS中主要有兩種WebView:UIWebViewWKWebView,UIWebView是iOS2之后開始使用,WKWebView是在iOS8開始使用,毫無疑問WKWebView將逐步取代笨重的UIWebView。

WKWebView的優(yōu)點(diǎn):

WKWebView更多的支持HTML5的特性

WKWebView更快,占用內(nèi)存可能只有UIWebView的1/3 ~ 1/4

WKWebView高達(dá)60fps的滾動刷新率和豐富的內(nèi)置手勢

WKWebView具有Safari相同的JavaScript引擎

WKWebView增加了加載進(jìn)度屬性

盡管講了這么多WKWebView的優(yōu)點(diǎn),但還有很多項(xiàng)目還沒有升級到iOS8,UIWebView也還有學(xué)習(xí)的必要,也可以通過對比WKWebView和UIWebView的使用,加深理解。

注意:Xcode7禁用了明碼的HTTP請求(但不限HTTPS請求),應(yīng)該在info.plist里添加下面的字段,否則無法響應(yīng)HTTP請求

添加App Transport Security Settings,并在其中設(shè)置Allow Arbitrary Loads為YES

xcode7設(shè)置HTTP請求

二、UIWebView

1. UIWebView加載請求

- (void)simpleUIWebViewTest {// 1.創(chuàng)建webview,并設(shè)置大小,"20"為狀態(tài)欄高度CGFloatwidth =self.view.frame.size.width;CGFloatheight =self.view.frame.size.height -20;UIWebView*webView = [[UIWebViewalloc] initWithFrame:CGRectMake(0,20, width, height)];// 2.創(chuàng)建URLNSURL*url = [NSURLURLWithString:@"http://www.baidu.com"];// 3.創(chuàng)建RequestNSURLRequest*request =[NSURLRequestrequestWithURL:url];// 4.加載網(wǎng)頁[webView loadRequest:request];// 5.最后將webView添加到界面[self.view addSubview:webView];self.webView = webView;}

2. UIWebView的實(shí)用加載函數(shù)

//加載網(wǎng)絡(luò)請求- (void)loadRequest:(NSURLRequest*)request;/*

功能:加載本地HTML字符串

string為要加載的本地HTML字符串

baseURL用來確定htmlString的基準(zhǔn)地址,相當(dāng)于HTML的標(biāo)簽的作用,定義頁面中所有鏈接的默認(rèn)地址

*/- (void)loadHTMLString:(NSString*)string baseURL:(nullableNSURL*)baseURL;/* 加載二進(jìn)制數(shù)據(jù) */- (void)loadData:(NSData*)data MIMEType:(NSString*)MIMEType? ? ? ? ? ? ? ? ? ? characterEncodingName:(NSString*)characterEncodingName? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? baseURL:(NSURL*)baseURL;

下面是加載HTML字符串的例子

- (void)loadLocalHTMLFileToUIWebView{// 獲取本地html文件文件路徑NSString*localHTMLPageName =@"myPage";NSString*path = [[NSBundlemainBundle] pathForResource:localHTMLPageName ofType:@"html"];// 從html文件中讀取html字符串NSString*htmlString = [NSStringstringWithContentsOfFile:path? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? encoding:NSUTF8StringEncodingerror:NULL];// 加載本地HTML字符串[self.webView loadHTMLString:htmlString baseURL:[[NSBundlemainBundle] bundleURL]];}

UIWebView不僅可以加載HTML頁面,還支持pdf、word、txt、各種圖片等等的顯示。使用loadRequest方法加載的URL是pdf、word、txt、各種圖片的URL路徑,就可以加載對應(yīng)的文件,這里就不演示了。

3. UIWebView的網(wǎng)頁導(dǎo)航方法

我們?yōu)g覽網(wǎng)頁,時常會使用到的刷新網(wǎng)頁、前進(jìn)、后退等導(dǎo)航操作,UIWebView里面也有對應(yīng)的操作方法。

#pragma mark - 判斷屬性// 是否可以后退@property(nonatomic,readonly,getter=canGoBack)BOOLcanGoBack;// 是否可以向前@property(nonatomic,readonly,getter=canGoForward)BOOLcanGoForward;// 是否正在加載@property(nonatomic,readonly,getter=isLoading)BOOLloading;#pragma mark - 操作方法// 刷新網(wǎng)頁- (void)reload;// 停止加載網(wǎng)頁- (void)stopLoading;// 后退- (void)goBack;// 前進(jìn)- (void)goForward;

4. UIWebViewDelegate代理方法

一共有四個方法:

//是否允許加載網(wǎng)頁,也可獲取js要打開的url,通過截取此url可與js交互-(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType;//開始加載網(wǎng)頁-(void)webViewDidStartLoad:(UIWebView*)webView;//網(wǎng)頁加載完成-(void)webViewDidFinishLoad:(UIWebView*)webView;//網(wǎng)頁加載錯誤-(void)webView:(UIWebView*)webViewdidFailLoadWithError:(NSError*)error;

5. UIWebView和JavaScript交互的方法

主要有兩方面:JS執(zhí)行OC代碼、OC調(diào)取寫好的JS代碼

JS執(zhí)行OC代碼:

JS是不能執(zhí)行OC代碼的,但是可以變相的執(zhí)行,JS可以將要執(zhí)行的操作封裝到網(wǎng)絡(luò)請求里面,然后OC攔截這個請求,獲取URL里面的字符串解析即可,這里用到代理協(xié)議里面的一個方法

-(BOOL)webView:(UIWebView *)webView? ? shouldStartLoadWithRequest:(NSURLRequest *)request? ? ? ? ? ? ? ? navigationType:(UIWebViewNavigationType)navigationType

OC調(diào)取寫好的JS代碼:

用到WebView的一個方法stringByEvaluatingJavaScriptFromString

// 實(shí)現(xiàn)自動定位JS代碼, htmlLocationID為定位的位置(由JS開發(fā)人員給出),實(shí)現(xiàn)自動定位代碼,應(yīng)該在網(wǎng)頁加載完成之后再調(diào)用NSString*javascriptStr = [NSStringstringWithFormat:@"window.location.href = '#%@'",htmlLocationID];// webview執(zhí)行代碼[self.webView stringByEvaluatingJavaScriptFromString:javascriptStr];// 獲取網(wǎng)頁的titleNSString*title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"];

6. UIWebView整合功能代碼

- (void)viewDidLoad{? ? [superviewDidLoad];? ? [selfinitWebView];}- (void)initWebView{// 1.創(chuàng)建webview,并設(shè)置大小,"20"為狀態(tài)欄高度CGFloatwidth =self.view.frame.size.width;CGFloatheight =self.view.frame.size.height -20;UIWebView*webView = [[UIWebViewalloc] initWithFrame:CGRectMake(0,20,width,height)];// 2.創(chuàng)建URLNSURL*url = [NSURLURLWithString:@"http://www.baidu.com"];// 3.創(chuàng)建RequestNSURLRequest*request =[NSURLRequestrequestWithURL:url];// 4.加載網(wǎng)頁[webView loadRequest:request];// 5.最后將webView添加到界面[self.view addSubview:webView];self.webView = webView;? ? webView.delegate =self;}#pragma mark 設(shè)置前進(jìn)后退按鈕狀態(tài)-(void)setBarButtonStatus{if(_webView.canGoBack) {? ? ? ? _barButtonBack.enabled =YES;? ? }else{? ? ? ? _barButtonBack.enabled =NO;? ? }if(_webView.canGoForward){? ? ? ? _barButtonForward.enabled =YES;? ? }else{? ? ? ? _barButtonForward.enabled =NO;? ? }}/*瀏覽器后退*/- (void)clickGoBackBtn{if(self.webView.canGoBack){? ? ? ? ? ? [self.webView goBack];? ? }}/*瀏覽器前進(jìn)*/- (void)clickGoForwardBtn{if(self.webView.canGoForward){? ? ? ? ? ? [self.webView goForward];? ? }}#pragma mark - UIWebViewDelegate代理方法#pragma mark 開始加載//是否允許加載網(wǎng)頁,也可獲取js要打開的url,通過截取此url可與js交互- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? navigationType:(UIWebViewNavigationType)navigationType{//截取URL,這里可以和JS進(jìn)行交互,但這里沒有寫,因?yàn)闀婕暗絁S的一些知識,增加復(fù)雜性NSString*urlString = [request.URL absoluteString];? ? urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];NSArray*urlComps = [urlString componentsSeparatedByString:@"://"];NSLog(@"urlString=%@---urlComps=%@",urlString,urlComps);returnYES;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }//開始加載網(wǎng)頁- (void)webViewDidStartLoad:(UIWebView*)webView{//顯示網(wǎng)絡(luò)請求加載[UIApplicationsharedApplication].networkActivityIndicatorVisible =true;}//網(wǎng)頁加載完成- (void)webViewDidFinishLoad:(UIWebView*)webView{//隱藏網(wǎng)絡(luò)請求加載圖標(biāo)[UIApplicationsharedApplication].networkActivityIndicatorVisible =false;? ? [selfsetBarButtonStatus];//取得html內(nèi)容NSLog(@"%@",[self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]);}//網(wǎng)頁加載錯誤- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error{UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:@"系統(tǒng)提示"message:@"網(wǎng)絡(luò)連接發(fā)生錯誤!"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"確定",nil];? ? ? ? [alert show];}

三、WKWebView

終于輪到WKWebView這個以后時代的主角出場了。要使用WKWebView需要導(dǎo)入 框架,你可以明顯地從下面看出我對WKWebView和UIWebView的區(qū)別對待,O(∩_∩)O哈哈~

1. WKWebView加載請求

和UIWebView用法完全一致:

#pragma mark - WKWebView簡單使用- (void)wkWebViewEasyUse{//1.創(chuàng)建WKWebViewCGFloatwidth =self.view.frame.size.width;CGFloatheight =self.view.frame.size.height -20;WKWebView*webView = [[WKWebViewalloc] initWithFrame:CGRectMake(0,20,width,height)];//2.創(chuàng)建URLNSURL*URL = [NSURLURLWithString:@"http://www.baidu.com"];//3.創(chuàng)建RequestNSURLRequest*request = [NSURLRequestrequestWithURL:URL];//4.加載Request[webView loadRequest:request];//5.添加到視圖self.webView = webView;? ? [self.view addSubview:webView];}

WKWebView顯示圖

2. WKWebView的實(shí)用加載方法

UIWebView有的,WKWebView都有,WKWebView多了一個加載文件方法,而且WKWebView的這些加載方法都有返回值。

/*加載請求*/- (WKNavigation*)loadRequest:(NSURLRequest*)request;/*加載本地HTML字符串*/- (WKNavigation*)loadHTMLString:(NSString*)string? ? ? ? ? ? ? ? ? ? ? ? ? baseURL:(nullableNSURL*)baseURL;/*加載本地文件*/- (WKNavigation*)loadFileURL:(NSURL*)url? ? ? allowingReadAccessToURL:(NSURL*)url;/* 加載二進(jìn)制數(shù)據(jù) */- (WKNavigation*)loadData:(NSData*)data? ? ? ? ? ? ? ? ? MIMEType:(NSString*)MIMEType? ? ? characterEncodingName:(NSString*)characterEncodingName? ? ? ? ? ? ? ? ? ? baseURL:(NSURL*)baseURL;

loadHTMLString方法的顯示效果會有一些區(qū)別,看下圖:

上面的是UIWebView加載效果,下面的是WKWebView加載的效果

我的HTML文件myPage.html如下:

Kenshin Cui's BlogI am Kenshin Cui

iOS Learn

估計(jì)兩種WebView加載HTML的默認(rèn)字體樣式是不一樣的,這里只是說一下

下面是加載本地文件的實(shí)例:

/* 模擬器調(diào)試加載mac本地文件 */- (void)loadLocalFile {// 1.創(chuàng)建webview,并設(shè)置大小,"20"為狀態(tài)欄高度CGFloatwidth =self.view.frame.size.width;CGFloatheight =self.view.frame.size.height -20;WKWebView*webView = [[WKWebViewalloc] initWithFrame:CGRectMake(0,20, width, height)];// 2.創(chuàng)建url? userName:電腦用戶名NSURL*url = [NSURLfileURLWithPath:@"/Users/userName/Desktop/bigIcon.png"];// 3.加載文件[webView loadFileURL:url allowingReadAccessToURL:url];// 最后將webView添加到界面[self.view addSubview:webView];}

模擬器加載本地文件效果圖

3. WKWebView的網(wǎng)頁導(dǎo)航方法

和UIWebView相差不大,多了返回值,多了一些屬性,也多了2個方法:

reloadFromOrigin,緩存加載

goToBackForwardListItem,跳轉(zhuǎn)到指定歷史頁面

下面是網(wǎng)頁導(dǎo)航方法列表:

@property(nonatomic,readonly)BOOLcanGoBack;@property(nonatomic,readonly)BOOLcanGoForward;@property(nonatomic,readonly,getter=isLoading)BOOLloading;- (WKNavigation*)goBack; - (WKNavigation*)goForward;- (WKNavigation*)reload; - (void)stopLoading;/* 加載進(jìn)度,取值范圍0~1 */@property(nonatomic,readonly)doubleestimatedProgress;/* 是否允許左右劃手勢導(dǎo)航,默認(rèn)不允許 */@property(nonatomic)BOOLallowsBackForwardNavigationGestures;/* 訪問歷史列表 */@property(nonatomic,readonly,strong)WKBackForwardList*backForwardList;/* 會比較網(wǎng)絡(luò)數(shù)據(jù)是否有變化,沒有變化則使用緩存,否則從新請求 */- (WKNavigation*)reloadFromOrigin;/* 比向前向后更強(qiáng)大,可以跳轉(zhuǎn)到某個指定歷史頁面 */- (WKNavigation*)goToBackForwardListItem:(WKBackForwardListItem*)item;

4. WKWebView的代理

UIWebView只有一個代理,但WKWebView有好幾個,但常用的有2個,

id navigationDelegate和id< WKUIDelegate > UIDelegate:

WKNavigationDelegate: 最常用,和UIWebViewDelegate功能類似,追蹤加載過程,有是否允許加載、開始加載、加載完成、加載失敗。

WKUIDelegate:UI界面相關(guān),原生控件支持,三種提示框:輸入、確認(rèn)、警告。

下面列出WKNavigationDelegate的常用代理方法

/* 1.在發(fā)送請求之前,決定是否跳轉(zhuǎn)? */-(void)webView:(WKWebView*)webViewdecidePolicyForNavigationAction:(WKNavigationAction*)navigationActiondecisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler;/* 2.頁面開始加載 */-(void)webView:(WKWebView*)webViewdidStartProvisionalNavigation:(WKNavigation*)navigation;/* 3.在收到服務(wù)器的響應(yīng)頭,根據(jù)response相關(guān)信息,決定是否跳轉(zhuǎn)。 */-(void)webView:(WKWebView*)webViewdecidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponsedecisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler;/* 4.開始獲取到網(wǎng)頁內(nèi)容時返回,需要注入JS,在這里添加 */-(void)webView:(WKWebView*)webViewdidCommitNavigation:(WKNavigation*)navigation;/* 5.頁面加載完成之后調(diào)用 */-(void)webView:(WKWebView*)webViewdidFinishNavigation:(WKNavigation*)navigation;/* error - 頁面加載失敗時調(diào)用 */-(void)webView:(WKWebView*)webViewdidFailProvisionalNavigation:(WKNavigation*)navigation;/* 其他 - 處理服務(wù)器重定向Redirect */-(void)webView:(WKWebView*)webViewdidReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation;

我們看看WKUIDelegate的幾個代理方法,雖然不是必須實(shí)現(xiàn)的,但是如果我們的頁面中有調(diào)用了JS的alert、confirm、prompt方法,我們應(yīng)該實(shí)現(xiàn)下面這幾個代理方法,然后在這里調(diào)用iOS的彈出窗,因?yàn)槭褂肳KWebView后,HTML中的alert、confirm、prompt方法調(diào)用是不會再彈出窗口了

下面列出WKUIDelegate的常用代理方法:

/* 輸入框,頁面中有調(diào)用JS的 prompt 方法就會調(diào)用該方法 */-(void)webView:(WKWebView*)webViewrunJavaScriptTextInputPanelWithPrompt:(NSString*)promptdefaultText:(nullableNSString*)defaultTextinitiatedByFrame:(WKFrameInfo*)framecompletionHandler:(void(^)(NSString *result))completionHandler;/* 確認(rèn)框,頁面中有調(diào)用JS的 confirm 方法就會調(diào)用該方法 */-(void)webView:(WKWebView*)webViewrunJavaScriptConfirmPanelWithMessage:(NSString*)messageinitiatedByFrame:(WKFrameInfo*)framecompletionHandler:(void(^)(BOOL result))completionHandler;/* 警告框,頁面中有調(diào)用JS的 alert 方法就會調(diào)用該方法 */-(void)webView:(WKWebView*)webViewrunJavaScriptAlertPanelWithMessage:(NSString*)messageinitiatedByFrame:(WKFrameInfo*)framecompletionHandler:(void(^)(void))completionHandler;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評論 2 374

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