WKWebview 淺探

1.內(nèi)存:在瀏覽網(wǎng)頁的時候,UIWebview 內(nèi)存增長迅速,而WKWebView 相對增長緩慢。
WKWebview
UIWebview
WKWebview加載一段時間后內(nèi)存的使用情況

UIWebview加載一段時間后內(nèi)存的使用情況
2. 加載速度:WKWebview 加載速度比UIWebview 更快 更流暢 這個可以自己寫一個demo 試試看
3.wkwebview 的基本的創(chuàng)建
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
 config.userContentController = [[WKUserContentController alloc] init];
 [config.userContentController addScriptMessageHandler:self name:@"Native"];

 self.wkWebView = [[WKWebView alloc] initWithFrame:frame configuration:config];
    [_wkWebView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
    [_wkWebView setNavigationDelegate:self];
    [_wkWebView setUIDelegate:self];
    [_wkWebView setMultipleTouchEnabled:YES];
    [_wkWebView setAutoresizesSubviews:YES];
    [_wkWebView.scrollView setAlwaysBounceVertical:YES];
    _wkWebView.scrollView.bounces = NO;
    [self addSubview:self.wkWebView];
4. 加載網(wǎng)頁

與 UIWebview相同 代碼如下

[self.wkWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
5.加載的回調(diào) (WKNavigationDelegate)

加載過程:開始 完成 失敗

 // 頁面開始加載時調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:    (WKNavigation *)navigation;
// 當(dāng)內(nèi)容開始返回時調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁面加載完成之后調(diào)用
 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面加載失敗時調(diào)用
 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

頁面跳轉(zhuǎn)

// 接收到服務(wù)器跳轉(zhuǎn)請求之后調(diào)用
 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 在收到響應(yīng)后,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 在發(fā)送請求之前,決定是否跳轉(zhuǎn)
 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
6.警告框 (WKUIDelegate協(xié)議)

web界面中有彈出警告框時調(diào)用

 webView           實現(xiàn)該代理的webview
 message           警告框中的內(nèi)容
 frame             主窗口
 completionHandler 警告框消失調(diào)用

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
7. js 處理

在創(chuàng)建wkwebview 的時候,有一個js的注冊方法:

  [config.userContentController addScriptMessageHandler:self name:@"Native"];

然后在(WKScriptMessageHandler)里有一個方法做js的處理

 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
      NSLog(@"JS 調(diào)用了 %@ 方法,傳回參數(shù) %@",message.name,message.body);
}

處理js

  - (void)handJS:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"Native"]) {
    NSLog(@"%@",message.body);
    //如果是自己定義的協(xié)議, 再截取協(xié)議中的方法和參數(shù), 判斷無誤后在這里手動調(diào)用oc方法
    NSDictionary *param = [self queryStringToDictionary:message.body];
    NSLog(@"get param:%@",[param description]);
    
    NSString *func = [param objectForKey:@"func"];
    
    //調(diào)用本地函數(shù)
    if([func isEqualToString:@"callFunc"]) {
     ......
    }
}
}

而UIWebview 處理js是:

  [self.webView evaluateJavaScript:javaScriptString completionHandler:completionHandler];

UIWebview 做一些事件處理的話是:
比如一個分享事件的案例:

  JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

  context[@"shareMethod"] = ^() {
       //這里可做分享事件
    };
8.清除緩存

UIWebview

[[NSURLCache sharedURLCache] removeAllCachedResponses];
NSURLCache * cache = [NSURLCache sharedURLCache];
[cache removeAllCachedResponses];
[cache setDiskCapacity:0];
[cache setMemoryCapacity:0];

WKWebview

iOS9 WKWebView新方法:點(diǎn)擊查看參考鏈接

NSSet *websiteDataTypes = [NSSet setWithArray:@[
                    WKWebsiteDataTypeDiskCache,
                    WKWebsiteDataTypeOfflineWebApplicationCache,
                    WKWebsiteDataTypeMemoryCache,
                    WKWebsiteDataTypeLocalStorage,
                    WKWebsiteDataTypeCookies,
                    WKWebsiteDataTypeSessionStorage,
                    WKWebsiteDataTypeIndexedDBDatabases,
                    WKWebsiteDataTypeWebSQLDatabases
                ]];
//你可以選擇性的刪除一些你需要刪除的文件 or 也可以直接全部刪除所有緩存的type  
//NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes   
modifiedSince:dateFrom completionHandler:^{
   // ?code
}];

注:在ios 8.0-9.0 之間可能會出現(xiàn)加載WKWebview 不顯示的問題,可以在該VC 將要出現(xiàn)的時候:

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

[self.navigationController  setNavigationBarHidden:NO];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容