一光羞、WKWebView簡介
在WWDC2014中纱兑,蘋果推出了最新的iOS8系統(tǒng)潜慎,其中也伴隨著很多控件的更新與升級。其中全新的WebKit庫讓人很是興奮局服。本文也將講解到WebKit中更新的WKWebView控件的新特性與使用方法驳遵,它很好的解決了UIWebView存在的內(nèi)存堤结、加載速度等諸多問題竞穷。
首先我們來看一下WKWebView的新特性
1.在性能、穩(wěn)定性鼠哥、功能方面有很大提升(最直觀的提升就是加載網(wǎng)頁是占用的內(nèi)存很少,測試加載不同網(wǎng)頁其內(nèi)存性能提升3倍到4倍,而且沒有緩存);
2.允許JavaScript的Nitro庫加載并使用(UIWebView中限制);
3.支持了更多的HTML5特性森渐;
4.高達(dá)60fps的滾動刷新率以及內(nèi)置手勢冒晰;
5.將UIWebViewDelegate與UIWebView重構(gòu)成了14類與3個協(xié)議(查看蘋果官方文檔)翩剪;
二前弯、WebView和WKWebView比較
UIWebView是蘋果繼承于UIView封裝的一個加載web內(nèi)容的類,它可以加載任何遠(yuǎn)端的web數(shù)據(jù)展示在你的頁面上,你可以像瀏覽器一樣前進(jìn)后退刷新等操作询枚。
1.webView常用初始化方式:
- (void)loadRequest:(NSURLRequest*)request;
最常用的一種方式金蜀,也是最簡單的一種方式。通過一個網(wǎng)頁URL來進(jìn)行加載尝胆,這個URL可以是遠(yuǎn)程的也可以是本地的含衔。
- (void)loadHTMLString:(NSString*)string baseURL:(NSURL*)baseURL;
這個方法需要將html文件讀取為字符串二庵,其中baseURL是我們自己設(shè)置的一個路徑催享,用于尋找html文件中引用的圖片等素材。
- (void)loadData:(NSData*)data MIMEType:(NSString*)MIMEType textEncodingName:(NSString*)textEncodingName baseURL:(NSURL*)baseURL;
這種加載方式用的比較少痰憎,但是比較靈活信殊,其中參數(shù)含義如下:
data是文件數(shù)據(jù)汁果,MIMEType是文件類型据德,textEncodingName是編碼類型跷车,一般是utf-8或者utf-16朽缴,baseURL是素材資源路徑密强。
2.一些常用的屬性和方法
@property(nonatomic,assign)id delegate; ?//設(shè)置webView的代理
@property(nonatomic,readonly,retain)UIScrollView*scrollView; //內(nèi)置的scrollView
@property(nonatomic,readonly,retain)NSURLRequest*request; //URL請求
- (void)reload; //重新加載數(shù)據(jù)
- (void)stopLoading; //停止加載數(shù)據(jù)
- (void)goBack; //返回上一級
- (void)goForward; //跳轉(zhuǎn)下一級
@property(nonatomic,readonly,getter=canGoBack)BOOL canGoBack; //獲取能否返回上一級
@property(nonatomic,readonly,getter=canGoForward)BOOL canGoForward; //獲取能否跳轉(zhuǎn)下一級
@property(nonatomic,readonly,getter=isLoading)BOOL loading; //獲取是否正在加載數(shù)據(jù)
- (NSString*)stringByEvaluatingJavaScriptFromString:(NSString*)script; //通過javaScript操作web數(shù)據(jù)
@property(nonatomic)BOOL scalesPageToFit; //設(shè)置是否縮放到適合屏幕大小
@property(nonatomic)BOOL allowsInlineMediaPlaybackNS_AVAILABLE_IOS(4_0);
設(shè)置是否使用內(nèi)聯(lián)播放器播放視頻
@property(nonatomic)BOOL mediaPlaybackRequiresUserActionNS_AVAILABLE_IOS(4_0);
設(shè)置視頻是否自動播放
@property(nonatomic)BOOL mediaPlaybackAllowsAirPlayNS_AVAILABLE_IOS(5_0);
設(shè)置音頻播放是否支持ari play功能
@property(nonatomic)BOOL suppressesIncrementalRenderingNS_AVAILABLE_IOS(6_0);
設(shè)置是否將數(shù)據(jù)加載如內(nèi)存后渲染界面
@property(nonatomic)BOOL keyboardDisplayRequiresUserActionNS_AVAILABLE_IOS(6_0);
設(shè)置用戶交互模式
3.webView協(xié)議中的方法
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType;
準(zhǔn)備加載內(nèi)容時調(diào)用的方法,通過返回值來進(jìn)行是否加載的設(shè)置
- (void)webViewDidStartLoad:(UIWebView*)webView;
開始加載時調(diào)用的方法
- (void)webViewDidFinishLoad:(UIWebView*)webView;
結(jié)束加載時調(diào)用的方法
- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error;
加載失敗時調(diào)用的方法
4.和JS的一些交互
主要有兩方面:js執(zhí)行OC代碼或渤、oc調(diào)取寫好的js代碼
js執(zhí)行OC代碼:js是不能執(zhí)行oc代碼的系冗,但是可以變相的執(zhí)行,js可以將要執(zhí)行的操作封裝到網(wǎng)絡(luò)請求里面薪鹦,然后oc攔截這個請求掌敬,獲取url里面的字符串解析即可惯豆,這里用到代理協(xié)議的一個方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
oc調(diào)取寫好的js代碼:這里用到UIwebview的一個方法奔害。示例代碼一個是網(wǎng)頁定位楷兽,一個是獲取網(wǎng)頁title:
(二)华临、WKWebView
1.初始化
a.首先要引入WebKit庫
b.初始化方法分為以下兩種
- (instancetype)initWithFrame:(CGRect)frame; // 默認(rèn)初始化
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration*)configurationNS_DESIGNATED_INITIALIZER; // 根據(jù)對webview的相關(guān)配置芯杀,進(jìn)行初始化
2.WKWebView屬性
WKBackForwardList:之前訪問過的web頁面的列表,可以通過后退和前進(jìn)動作來訪問到银舱。
WKBackForwardListItem: webview中后退列表里的某一個網(wǎng)頁瘪匿。
WKFrameInfo:包含一個網(wǎng)頁的布局信息。
WKNavigation:包含一個網(wǎng)頁的加載進(jìn)度信息寻馏。
WKNavigationAction:包含可能讓網(wǎng)頁導(dǎo)航變化的信息棋弥,用于判斷是否做出導(dǎo)航變化。
WKNavigationResponse:包含可能讓網(wǎng)頁導(dǎo)航變化的返回內(nèi)容信息诚欠,用于判斷是否做出導(dǎo)航變化顽染。
WKPreferences:概括一個webview的偏好設(shè)置。
WKProcessPool:表示一個web內(nèi)容加載池轰绵。
WKUserContentController:提供使用JavaScript post信息和注射script的方法粉寞。
WKScriptMessage:包含網(wǎng)頁發(fā)出的信息。
WKUserScript:表示可以被網(wǎng)頁接受的用戶腳本左腔。
WKWebViewConfiguration:初始化webview的設(shè)置唧垦。
WKWindowFeatures:指定加載新網(wǎng)頁時的窗口屬性。
WKNavigationDelegate:提供了追蹤主窗口網(wǎng)頁加載過程和判斷主窗口和子窗口是否進(jìn)行頁面加載新頁面的相關(guān)方法液样。
WKScriptMessageHandler:提供從網(wǎng)頁中收消息的回調(diào)方法振亮。
WKUIDelegate:提供用原生控件顯示網(wǎng)頁的方法回調(diào)。
3.WKWebView的代理方法
WKNavigationDelegate
該代理提供的方法鞭莽,可以用來追蹤加載過程(頁面開始加載坊秸、加載完成、加載失斉炫)褒搔、決定是否執(zhí)行跳轉(zhuǎn)
// 頁面開始加載時調(diào)用
-?(void)webView:(WKWebView*)webViewdidStartProvisionalNavigation:(WKNavigation*)navigation;
//?當(dāng)內(nèi)容開始返回時調(diào)用
-?(void)webView:(WKWebView*)webViewdidCommitNavigation:(WKNavigation*)navigation;
//?頁面加載完成之后調(diào)用
-?(void)webView:(WKWebView*)webViewdidFinishNavigation:(WKNavigation*)navigation;
//?頁面加載失敗時調(diào)用
-?(void)webView:(WKWebView*)webViewdidFailProvisionalNavigation:(WKNavigation*)navigation;
// 接收到服務(wù)器跳轉(zhuǎn)請求之后調(diào)用
-?(void)webView:(WKWebView*)webViewdidReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation;
//?在收到響應(yīng)后,決定是否跳轉(zhuǎn)
-?(void)webView:(WKWebView*)webViewdecidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponsedecisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler;
//?在發(fā)送請求之前喷面,決定是否跳轉(zhuǎn)
-?(void)webView:(WKWebView*)webViewdecidePolicyForNavigationAction:(WKNavigationAction*)navigationActiondecisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler;
WKUIDelegate
- (WKWebView*)webView:(WKWebView*)webView createWebViewWithConfiguration:(WKWebViewConfiguration*)configuration forNavigationAction:(WKNavigationAction*)navigationAction windowFeatures:(WKWindowFeatures*)windowFeatures;?
//此代理方法用于創(chuàng)建一個新的WebView
WKScriptMessageHandler
這個協(xié)議中包含一個必須實(shí)現(xiàn)的方法星瘾,這個方法是提高App與web端交互的關(guān)鍵,它可以直接將接收到的JS腳本轉(zhuǎn)化為OC或Swift對象惧辈。
-?(void)userContentController:(WKUserContentController*)userContentControllerdidReceiveScriptMessage:(WKScriptMessage*)message;
總結(jié):
蘋果向我們提供WKWebView死相,擁有UIWebView的所有功能,目的就是為了替代之前UIWebView咬像,相比與UIWebView算撮,WKWebView不僅在加載web網(wǎng)頁時性能有巨大提升生宛,而且也提供了更多的方法與JS進(jìn)行交互。但是WKWebView要在ios8.0之后才能使用肮柜,因此陷舅,如果我們使用Swift來開發(fā)應(yīng)用,兼容版本從8.0開始時审洞,可以直接使用WKWebView莱睁。