WKWebView概述
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)通過觀察設備內(nèi)存變化,發(fā)現(xiàn)WKWebView的內(nèi)存被分配到了com.apple.WebKit進程,WebView里面消耗的內(nèi)存不再屬于我們App的進程啦。(3)觀察Safari的內(nèi)存使用情況,內(nèi)存情況是一樣的。看來蘋果把Safari的內(nèi)核開放給開發(fā)者用了。(4)但是com.apple.WebKit的內(nèi)存也一直在漲,也會堆積很多,不知道有實質(zhì)上的變化沒。
二、WKWebView增加的屬性和方法
1.增加的屬性:(1)estimatedProgress:加載進度條,在IOS8之前我們是通過一個假的進度條來實現(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、無法設置緩存1.在UIWebView,使用NSURLCache,可以設置我們自己的緩存,但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的離線緩存機制了,需要瀏覽器和服務器配合來實現(xiàn),WKWebView支持H5離線緩存。另外不需要寫任何關于離線緩存的代碼。
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/WKWebViewTips)1.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的應用,iOS7以下使用UIWebView,iOS8使用WKWebView,蘋果會拒絕你的發(fā)布。也就是說,如果你想使用WKWebView,就必須拋棄iOS8以下的系統(tǒng)。
六、delegate方法的不同
1.代理方法概述:?UIWebView支持的代理是UIWebViewDelegate,WKWebView支持的代理是WKNavigationDelegate和WKUIDelegate。WKNavigationDelegate主要實現(xiàn)了涉及到導航跳轉(zhuǎn)方面的回調(diào)方法。WKUIDelegate主要實現(xiàn)了涉及到界面顯示的回調(diào)方法:如WKWebView的改變和js相關內(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的確認框,交由本地控件來實現(xià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
//這個代理方法表示當客戶端收到服務器的響應頭,根據(jù)response相關信息,可以決定這次跳轉(zhuǎn)是否可以繼續(xù)進行。
- (void)webView:(WKWebView *)webView
? decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse
? decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
{
? ? decisionHandler(WKNavigationResponsePolicyAllow);
}
//根據(jù)webView、navigationAction相關信息決定這次跳轉(zhuǎn)是否可以繼續(xù)進行,這些信息包含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
{
?? ?
}
//當Main Frame收到服務器的重定向請求是調(diào)用
- (void)webView:(WKWebView *)webView
? ? didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation
{
?? ?
}
//當Main Frame開始加載數(shù)據(jù),發(fā)生錯誤時調(diào)用
- (void)webView:(WKWebView *)webView
? ? didFailProvisionalNavigation:(WKNavigation *)navigation
? ? withError:(NSError *)error
{
?? ?
}
//當Main Frame的內(nèi)容開始到達時調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
?? ?
}
//當完成一個Main Frame加載時調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
?? ?
}
//當一個完成加載的MainFrame發(fā)生錯誤時調(diào)用
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
?? ?
}
//處理證書相關的東西
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge?completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
?? ?
}
總結(jié)
以上是生活随笔為你收集整理的WKWebView概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: clickhouse 分片
- 下一篇: java web 开发技术大全 代码_J