日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WKWebView概述

發(fā)布時間:2024/7/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WKWebView概述 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、概述
1.iOS 8 SDK中發(fā)布了新的WebView框架----WebKit.framework。2.WebKit使用WKWebView來代替IOS的UIWebView和OSX的NSWebView,并且使用Nitro JavaScript引擎,這意味著所有第三方瀏覽器運行JavaScript將會跟safari一樣快。3.內(nèi)存問題:(1)UIWebView類的內(nèi)存問題一直廣受詬病,現(xiàn)在問題終于解決了,使用WKWebView,我們APP的內(nèi)存情況基本上不會因為使用了WebView而有多少變化。(2)通過觀察設(shè)備內(nèi)存變化,發(fā)現(xiàn)WKWebView的內(nèi)存被分配到了com.apple.WebKit進(jìn)程,WebView里面消耗的內(nèi)存不再屬于我們App的進(jìn)程啦。(3)觀察Safari的內(nèi)存使用情況,內(nèi)存情況是一樣的。看來蘋果把Safari的內(nèi)核開放給開發(fā)者用了。(4)但是com.apple.WebKit的內(nèi)存也一直在漲,也會堆積很多,不知道有實質(zhì)上的變化沒。
二、WKWebView增加的屬性和方法
1.增加的屬性:(1)estimatedProgress:加載進(jìn)度條,在IOS8之前我們是通過一個假的進(jìn)度條來實現(xiàn)(2)backForwardList:表示historyList,是只讀的。(3)WKWebViewConfiguration *configuration; 初始化webview的配置
2.增加的方法:(1)初始化:- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration?
(2)跳到歷史的某個頁面-(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;?
三、相同的屬性和方法goBack、goForward、canGoBack、canGoForward、stopLoading、loadRequest、scrollView
四、被刪去的屬性和方法:1、主動調(diào)用JS的方法:- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;替換為:- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler;
2、無法設(shè)置緩存1.在UIWebView,使用NSURLCache,可以設(shè)置我們自己的緩存,但WKWebView不支持NSURLCache。NSURLCache完全攔截不到WKWebView的任何請求。2.UIWebView也可以使用NSURLProtocol來實現(xiàn)離線緩存,在WKWebView中一樣不適用。和NSURLCache不一樣的是,在WKWebView中,NSURLProtocol能攔截到最初始的網(wǎng)頁鏈接,比如使用LoadReqeust方法加載的網(wǎng)頁地址或者內(nèi)部自動的頁面跳轉(zhuǎn)。3.唯一實現(xiàn)離線緩存的方法就是使用HTML5的離線緩存機制了,需要瀏覽器和服務(wù)器配合來實現(xiàn),WKWebView支持H5離線緩存。另外不需要寫任何關(guān)于離線緩存的代碼。
3.類似于PhoneGap實現(xiàn)網(wǎng)頁調(diào)用native界面的攔截入口沒有了。(1)根據(jù)上面第2點的表述,可以使用NSURLProtocol來攔截。類似于PhoneGap實現(xiàn)網(wǎng)頁調(diào)用,一般都不是HTTP協(xié)議,一般都自定義協(xié)議名稱,比如callnative。要想攔截這樣的協(xié)議,則不能實現(xiàn)以下兩個方法:decidePolicyForNavigationAction、decidePolicyForNavigationResponse。(2)可以使用WKUIDelegate的runJavaScriptAlertPanelWithMessage方法來實現(xiàn)傳遞調(diào)用,網(wǎng)頁端調(diào)用alert方法,并且將調(diào)用鏈接作為message參數(shù)。然后就會被runJavaScriptAlertPanelWithMessage方法攔截到,就可以獲取到調(diào)用鏈接了,而alert的UI現(xiàn)實交由我們處理,我們不做處理,只獲取Message來處理頁面調(diào)用。
五、需要提出的一些不同的地方:(國外文章摘錄:https://github.com/ShingoFukuyama/WKWebViewTips1.file:///協(xié)議只能打開tmp目錄下的文件。2.在Storyboard和IB中,不能使用WKWebView。3.JavaScript中的alert, confirm, prompt調(diào)用需要實現(xiàn)WKUIDelegate。4.Cookie, Cache, Credential, WebKit data不能很容易的刪除。可以綜合使用以下的方法:(1)和使用UIWebView一樣,使用NSURLCache和NSHTTPCookie刪除cookie和緩存。如果你使用了WKProccessPool,重新初始化它。(2)刪除Library目錄中的Cookies, Caches, WebKit子文件夾。(3)移除所有的WKWebViews。。5.WKWebView不能和iOS7及以下系統(tǒng)的UIWebView共存。? 如果你想發(fā)布一個同時支持WKWebView和UIWebView的應(yīng)用,iOS7以下使用UIWebView,iOS8使用WKWebView,蘋果會拒絕你的發(fā)布。也就是說,如果你想使用WKWebView,就必須拋棄iOS8以下的系統(tǒng)。
六、delegate方法的不同
1.代理方法概述:?UIWebView支持的代理是UIWebViewDelegate,WKWebView支持的代理是WKNavigationDelegate和WKUIDelegate。WKNavigationDelegate主要實現(xiàn)了涉及到導(dǎo)航跳轉(zhuǎn)方面的回調(diào)方法。WKUIDelegate主要實現(xiàn)了涉及到界面顯示的回調(diào)方法:如WKWebView的改變和js相關(guān)內(nèi)容。??2.所有代理方法:

#pragma mark - WKUIDelegate


//WKWebVie截獲JS的輸入框,交由本地控件來實現(xiàn),最后將輸入結(jié)果通過block回調(diào)給網(wǎng)頁

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt

? ? defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame

? ? completionHandler:(void (^)(NSString *result))completionHandler

{

? ? completionHandler(@"返回結(jié)果");

}


//WKWebVie截獲JS的選擇框,交由本地控件來實現(xiàn),最后將選擇結(jié)果通過block回調(diào)給網(wǎng)頁

- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message

? initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler

{

? ? completionHandler(YES);

}


//WKWebVie截獲JS的確認(rèn)框,交由本地控件來實現(xiàn),最后將確認(rèn)點擊結(jié)果通過block回調(diào)給網(wǎng)頁

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message

? initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler

{

? ? completionHandler();

}


//網(wǎng)頁要跳轉(zhuǎn)到新的窗口來展示網(wǎng)頁,WKWebView攔截,有我們來確定顯示。

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration

?? forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures

{

? ? return nil;

}


#pragma mark - WKNavigationDelegate


//這個代理方法表示當(dāng)客戶端收到服務(wù)器的響應(yīng)頭,根據(jù)response相關(guān)信息,可以決定這次跳轉(zhuǎn)是否可以繼續(xù)進(jìn)行。

- (void)webView:(WKWebView *)webView

? decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse

? decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler

{

? ? decisionHandler(WKNavigationResponsePolicyAllow);

}


//根據(jù)webViewnavigationAction相關(guān)信息決定這次跳轉(zhuǎn)是否可以繼續(xù)進(jìn)行,這些信息包含HTTP發(fā)送請求,如頭部包含User-Agent,Accept

- (void)webView:(WKWebView *)webView

? decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction

? decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

{

? ? decisionHandler(WKNavigationActionPolicyAllow);

}


//一個Main Frame開始顯示時調(diào)用

- (void)webView:(WKWebView *)webView?didStartProvisionalNavigation:(WKNavigation *)navigation

{

?? ?

}


//當(dāng)Main Frame收到服務(wù)器的重定向請求是調(diào)用

- (void)webView:(WKWebView *)webView

? ? didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation

{

?? ?

}


//當(dāng)Main Frame開始加載數(shù)據(jù),發(fā)生錯誤時調(diào)用

- (void)webView:(WKWebView *)webView

? ? didFailProvisionalNavigation:(WKNavigation *)navigation

? ? withError:(NSError *)error

{

?? ?

}


//當(dāng)Main Frame的內(nèi)容開始到達(dá)時調(diào)用

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{

?? ?

}


//當(dāng)完成一個Main Frame加載時調(diào)用

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{

?? ?

}


//當(dāng)一個完成加載的MainFrame發(fā)生錯誤時調(diào)用

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

{

?? ?

}


//處理證書相關(guān)的東西

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge?completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler

{

?? ?

}


部分內(nèi)容轉(zhuǎn)自:http://blog.csdn.net/cyforce/article/details/37657009

總結(jié)

以上是生活随笔為你收集整理的WKWebView概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。