你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> WKWebView與UIWebView的區別

WKWebView與UIWebView的區別

編輯:IOS開發綜合

WKWebView與UIWebView的區別

IOS8以後,蘋果推出了新框架Wekkit,提供了替換UIWebView的組件WKWebView。使用WKWebView,速度會更快,占用內存少。

WKWebView的特性:

在性能、穩定性、功能方面有很大提升,直觀體現是內存占用變少; 允許JavaScript的Nitro庫加載並使用(UIWebView中限制); 支持了更多的html5特性; 高達60fps的滾動刷新率以及內置手勢; 將UIWebViewDelegate與UIWebView重構成了14類與3個協議(詳見SDK);

本文將從以下幾個方面說下WKWebView的基本用法:

加載網頁 加載的狀態回調 新的WKUIDelegate協議 動態加載並運行JS代碼 webView 執行JS代碼 JS調用App注冊過的方法 一、加載網頁

加載網頁或HTML代碼的方式與UIWebView相同,代碼示例如下:

WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"xx"]]];
[self.view addSubview:webView];
二、加載的狀態回調 (WKNavigationDelegate)

用來追蹤加載過程(頁面開始加載、加載完成、加載失敗)的方法:

// 頁面開始加載時調用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當內容開始返回時調用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁面加載完成之後調用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面加載失敗時調用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

頁面跳轉的代理方法:

// 接收到服務器跳轉請求之後調用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 在收到響應後,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 在發送請求之前,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
三、新的WKUIDelegate協議

這個協議主要用於WKWebView處理web界面的三種提示框(警告框、確認框、輸入框),下面是警告框的例子:

/**
 *  web界面中有彈出警告框時調用
 *
 *  @param webView           實現該代理的webview
 *  @param message           警告框中的內容
 *  @param frame             主窗口
 *  @param completionHandler 警告框消失調用
 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
四、動態加載並運行JS代碼

用於在客戶端內部加入JS代碼,並執行,示例如下:

// 圖片縮放的js代碼
NSString *js = @"var count = document.images.length;for (var i = 0; i < count; i++) {var image = document.images[i];image.style.width=320;};Window.alert('找到' + count + '張圖');";
// 根據JS字符串初始化WKUserScript對象
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
// 根據生成的WKUserScript對象,初始化WKWebViewConfiguration
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addUserScript:script];
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
[_webView loadHTMLString:@"<head></head><imgea src='http://file.qingyaoweb.com/d/file/shujuku/mrzscjqwrlp.jpg' />"baseURL:nil];
[self.view addSubview:_webView];
五、webView 執行JS代碼

用戶調用用JS寫過的代碼,一般指服務端開發的:

//JavaScriptString是JS方法名,completionHandler是異步回調block
[self.webView evaLuateJavaScript:javaScriptString completionHandler:completionHandler];
六、JS調用App注冊過的方法

再WKWebView裡面注冊供JS調用的方法,是通過WKUserContentController類下面的方法:

- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;

scriptMessageHandler是代理回調,JS調用name方法後,OC會調用scriptMessageHandler指定的對象。
JS在調用OC注冊方法的時候要用下面的方式:

Window.webkit.messageHandlers.<name>.postMessage(<messageBody>)

注意,name(方法名)是放在中間的,messageBody只能是一個對象,如果要傳多個值,需要封裝成數組,或者字典。整個示例如下:

//OC注冊供JS調用的方法
[[_webView configuration].userContentController addScriptMessageHandler:self name:@"closeMe"];

//OC在JS調用方法做的處理
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    NSLog(@"JS 調用了 %@ 方法,傳回參數 %@",message.name,message.body);
}

//JS調用
    Window.webkit.messageHandlers.closeMe.postMessage(null);

如果你在self的dealloc打個斷點,會發現self沒有釋放!這顯然是不行的!谷歌後看到一種解決方法,如下:

@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>

@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;

- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;

@end

@implementation WeakScriptMessageDelegate

- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate
{
    self = [super init];
    if (self) {
        _scriptDelegate = scriptDelegate;
    }
    return self;
}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}

@end

思路是另外創建一個代理對象,然後通過代理對象回調指定的self,

WKUserContentController *userContentController = [[WKUserContentController alloc] init];    
[userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"closeMe"];

運行代碼,self釋放了,WeakScriptMessageDelegate卻沒有釋放啊啊啊!
還需在self的dealloc裡面 添加這樣一句代碼:

[[_webView configuration].userContentController removeScriptMessageHandlerForName:@"closeMe"];

目前,大多數App需要支持IOS7以上的版本,而WKWebView只在IOS8後才能用,所以需要一個兼容性方案,既iOS7下用UIWebView,iOS8後用WKWebView。

本文轉載自這裡,感謝作者。

以上就是WKWebView與UIWebView的區別的全文介紹,希望對您學習和使用ios應用開發有所幫助.

【WKWebView與UIWebView的區別】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved