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新方法:點擊查看參考鏈接
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];
}