1. 程式人生 > >WKWebView詳解&WKWebVieW和JS互動

WKWebView詳解&WKWebVieW和JS互動

開發App的過程中,常常會遇到在App內部載入網頁,通常用UIWebView載入。而這個自iOS2.0開始使用的Web容器一直是開發的心病:載入速度慢,佔用記憶體多,優化困難。如果載入網頁多,還可能因為過量佔用記憶體而給系統kill掉。各種優化的方法效果也不那麼明顯iOS8 以後,蘋果推出了新框架 WebKit,提供了替換 UIWebView 的元件 WKWebView。各種 UIWebView 的效能問題沒有了,速度更快了,佔用記憶體少了,體驗更好了,下面列舉一些其它的優勢:

1、在效能、穩定性、功能方面有很大提升(最直觀的體現就是載入網頁是佔用的記憶體,模擬器載入百度與開源中國網站時,WKWebView佔用23M,而UIWebView佔用85M);

2、允許JavaScript的Nitro庫載入並使用(UIWebView中限制);

3、支援了更多的HTML5特性;

4、高達60fps的滾動重新整理率以及內建手勢;

5、將UIWebViewDelegate與UIWebView重構成了14類與3個協議(檢視蘋果官方文件);

14個類

WKBackForwardList: 之前訪問過的 web 頁面的列表,可以通過後退和前進動作來訪問到。

WKBackForwardListItem: webview 中後退列表裡的某一個網頁。

WKFrameInfo: 包含一個網頁的佈局資訊。

WKNavigation: 包含一個網頁的載入進度資訊。

WKNavigationAction: 包含可能讓網頁導航變化的資訊,用於判斷是否做出導航變化。

WKNavigationResponse: 包含可能讓網頁導航變化的返回內容資訊,用於判斷是否做出導航變化。

WKPreferences: 概括一個 webview 的偏好設定。

WKProcessPool: 表示一個 web 內容載入池。

WKUserContentController: 提供使用 JavaScript post 資訊和注射 script 的方法。

WKScriptMessage: 包含網頁發出的資訊。

WKUserScript: 表示可以被網頁接受的使用者指令碼。

WKWebViewConfiguration: 初始化 webview 的設定。

WKWindowFeatures: 指定載入新網頁時的視窗屬性。

3個協議

WKNavigationDelegate: 提供了追蹤主視窗網頁載入過程和判斷主視窗和子視窗是否進行頁面載入新頁面的相關方法。

WKUIDelegate: 提供用原生控制元件顯示網頁的方法回撥。

WKScriptMessageHandler: 提供從網頁中收訊息的回撥方法。

所有相關的類的API

//上文介紹過的偏好配置@property(nonatomic,readonly,copy)WKWebViewConfiguration*configuration;// 導航代理 @property(nullable,nonatomic,weak)id<WKNavigationDelegate> navigationDelegate;// 使用者互動代理@property(nullable,nonatomic,weak)id<WKUIDelegate>UIDelegate;// 頁面前進、後退列表@property(nonatomic,readonly,strong)WKBackForwardList*backForwardList;// 預設構造器-(instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration*)configuration NS_DESIGNATED_INITIALIZER;//載入請求API-(nullableWKNavigation*)loadRequest:(NSURLRequest*)request;// 載入URL-(nullableWKNavigation*)loadFileURL:(NSURL*)URL allowingReadAccessToURL:(NSURL*)readAccessURL NS_AVAILABLE(10_11,9_0);// 直接載入HTML-(nullableWKNavigation*)loadHTMLString:(NSString*)string baseURL:(nullableNSURL*)baseURL;// 直接載入data-(nullableWKNavigation*)loadData:(NSData*)data MIMEType:(NSString*)MIMEType characterEncodingName:(NSString*)characterEncodingName baseURL:(NSURL*)baseURL NS_AVAILABLE(10_11,9_0);// 前進或者後退到某一頁面-(nullableWKNavigation*)goToBackForwardListItem:(WKBackForwardListItem*)item;// 頁面的標題,支援KVO的@property(nullable,nonatomic,readonly,copy)NSString*title;// 當前請求的URL,支援KVO的@property(nullable,nonatomic,readonly,copy)NSURL*URL;// 標識當前是否正在載入內容中,支援KVO的@property(nonatomic,readonly,getter=isLoading)BOOL loading;// 當前載入的進度,範圍為[0, 1]@property(nonatomic,readonly)double estimatedProgress;// 標識頁面中的所有資源是否通過安全加密連線來載入,支援KVO的@property(nonatomic,readonly)BOOL hasOnlySecureContent;// 當前導航的證書鏈,支援KVO@property(nonatomic,readonly,copy)NSArray*certificateChain NS_AVAILABLE(10_11,9_0);// 是否可以招待goback操作,它是支援KVO的@property(nonatomic,readonly)BOOL canGoBack;// 是否可以執行gofarward操作,支援KVO@property(nonatomic,readonly)BOOL canGoForward;// 返回上一頁面,如果不能返回,則什麼也不幹-(nullableWKNavigation*)goBack;// 進入下一頁面,如果不能前進,則什麼也不幹-(nullableWKNavigation*)goForward;// 重新載入頁面-(nullableWKNavigation*)reload;// 重新從原始URL載入-(nullableWKNavigation*)reloadFromOrigin;// 停止載入資料-(void)stopLoading;// 執行JS程式碼-(void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void(^ __nullable)(__nullableid,NSError* __nullable error))completionHandler;// 標識是否支援左、右swipe手勢是否可以前進、後退@property(nonatomic)BOOL allowsBackForwardNavigationGestures;// 自定義user agent,如果沒有則為nil@property(nullable,nonatomic,copy)NSString*customUserAgent NS_AVAILABLE(10_11,9_0);// 在iOS上預設為NO,標識不允許連結預覽@property(nonatomic)BOOL allowsLinkPreview NS_AVAILABLE(10_11,9_0);#if TARGET_OS_IPHONE/*! @abstract The scroll view associated with the web view.
 */@property(nonatomic,readonly,strong)UIScrollView*scrollView;#endif#if !TARGET_OS_IPHONE// 標識是否支援放大手勢,預設為NO@property(nonatomic)BOOL allowsMagnification;// 放大因子,預設為1@property(nonatomic)CGFloat magnification;// 根據設定的縮放因子來縮放頁面,並居中顯示結果在指定的點-(void)setMagnification:(CGFloat)magnification centeredAtPoint:(CGPoint)point;

使用

1、首先需要先引入WebKit庫

#import <WebKit/WebKit.h>

2、兩種初始化方法

// 預設初始化-(instancetype)initWithFrame:(CGRect)frame;// 根據對webview的相關配置,進行初始化-(instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration*)configuration NS_DESIGNATED_INITIALIZER;

3、載入網頁

最基礎的方法和UIWebView一樣

NSURL*url =[NSURLURLWithString:@"www.jianshu.com"];NSURLRequest*request =[NSURLRequest requestWithURL:url];[webView loadRequest:request];

一些其他的載入方法

//載入本地URL檔案-(nullableWKNavigation*)loadFileURL:(NSURL*)URL 
               allowingReadAccessToURL:(NSURL*)readAccessURL

//載入本地HTML字串-(nullableWKNavigation*)loadHTMLString:(NSString*)string
                                  baseURL:(nullableNSURL*)baseURL;//載入二進位制資料-(nullableWKNavigation*)loadData:(NSData*)data MIMEType:(NSString*)MIMEType characterEncodingName:(NSString*)characterEncodingName baseURL:(NSURL*)baseURL

4、代理方法

1、【WKNavigationDelegate協議】

該代理提供的方法,可以用來追蹤載入過程(頁面開始載入、載入完成、載入失敗)、決定是否執行跳轉。

// 頁面開始載入時呼叫-(void)webView:(WKWebView*)webViewdidStartProvisionalNavigation:(WKNavigation*)navigation;// 當內容開始返回時呼叫-(void)
            
           

相關推薦

WKWebView&WKWebVieWJS互動

開發App的過程中,常常會遇到在App內部載入網頁,通常用UIWebView載入。而這個自iOS2.0開始使用的Web容器一直是開發的心病:載入速度慢,佔用記憶體多,優化困難。如果載入網頁多,還可能因為過量佔用記憶體而給系統kill掉。各種優化的方法效果也不那麼明顯iOS8 以後,蘋果推出了新框架 W

WKWebViewUIWebView載入本地htmlJS互動各種坑解決辦法

因為蘋果的檔案機制,所有的資原始檔都相當於放在bundle的路徑裡,裡面不分任何資料夾路徑,所以我們在載入(js, css, png)等等的資原始檔的時候,不應該加上任何檔名,所以最好是把所有有關html的檔案都放在同一平級的資料夾 UIWebView 1.OC調JS

Android開發之WebViewJS互動

Android提供了一個很強大的WebView控制元件用來處理Web網頁,而在網頁中,JavaScript又是一個很舉足輕重的指令碼。本文將介紹如何實現Java程式碼和Javascript程式碼的相互呼叫。 如何實現 實現Java和js互

WKWebView OCJS互動

網頁很簡單,只有一個按鈕,點選按鈕會觸發一個方法,在事件的方法中通過呼叫 window.webkit.messageHandlers.NativeModel.p

跨域問題相關知識(原生jsjquery兩種方法實現jsonp跨域)

syn con 加載 developer 兩種方法 ray exe 編寫 分組 1、同源策略 同源策略(Same origin policy),它是由Netscape提出的一個著名的安全策略。同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽

Swift WKWebView(二):iOS與js互動

在上一篇中我們介紹了Swift下WKWebView的基本使用方法,下面總結一下iOS與js互動的實現,最終的頁面效果如下圖所示: 其中,js有關程式碼如下: function navButtonAction(name,age){

Swift.WKWebView與Html檔案的JS互動

實現效果: 以最簡單的形式與最簡單的demo來實現WKWebView與HTML檔案的JS互動方式. 包括Swift呼叫JS方法以及JS呼叫Swift原生方法.並傳遞各種型別引數 實現在控制檯列印JS中的Console.log內容. 1.新增WeakScrip

ios WKWebView

    專案中,使用到web載入,是件再正常不過的事情.之前一直使用UIWebView.但ios8後,蘋果推出了WKWebView.效能優化更加完善.並以更加穩定,載入滑動等功能方面更加流暢,記憶體佔

WKWebview

UIWebView 之痛開發App的過程中,常常會遇到在App內部載入網頁,通常用UIWebView載入。而這個自iOS2.0開始使用的Web容器一直是開發的心病:載入速度慢,佔用記憶體多,優化困難。如果載入網頁多,還可能因為過量佔用記憶體而給系統kill掉。各種優化的方法效

httphttps的作用與區別

就是 免費證書 構建 難題 原理 過程 完全 mod 支持 PS: https就是http和TCP之間有一層SSL層,這一層的實際作用是防止釣魚和加密。防止釣魚通過網站的證書,網站必須有CA證書,證書類似於一個解密的簽名。另外是加密,加密需要一個密鑰交換算法,雙方通過交換後

【TP3.2】_initialize() __construct() 的區別聯系

instance ins 執行 構造方法 ces 實例化 direct control 初始化 1、假設 一個AdminController.class.php 集成至 \Think\Controller 類, 我們來看看Controller.class.php的構造方法源

Vue-multiselect(Vue.js選擇框解決方案)

type 選擇框 this width port app mount 分享圖片 his github地址:https://github.com/shentao/vue-multiselect 以下代碼,可以直接建一個html文件,運行看到效果: 運行效果: &

pathclasspath的區別

1.7 找到 index 配置 的區別 jdk1.7 修改 jdk1.6 應用 詳解path和classpath的區別 path的作用 path是系統用來指定可執行文件的完整路徑,即使不在path中設置JDK的路徑也可執行JAVA文件,但必須把完整的路徑寫出來,如

AddressRFC 822

                               詳解Address和RFC 822   名稱解釋

C++STL之Vector向量,用法例子 一起學習 一起加油

                                            &

Spring boot 配置檔案 (properties yml )

從其他框架來看 我們都有自己的配置檔案, hibernate有hbm,mybatis 有properties, 同樣, Spring boot 也有全域性配置檔案。 Springboot使用一個全域性的配置檔案,而且配置檔案的名字是固定的。 有兩種 application.properties

ios UIWebView使用js互動

下面我們一起學習下UIWebView的使用 一、 定義webView 程式碼如下 #pragma 懶載入 - (UIWebView *)webView { if (!_webView) { _webView = [[UIWebView alloc] initWit

使用 Node.js 開發簡單的腳手架工具

這篇文章主要介紹了詳解使用 Node.js 開發簡單的腳手架工具,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 前言 像我們熟悉的 vue-cli,react-native-cli 等腳手架,只需要輸入簡單的命令 vue init webpack pro

Tiniux 3.0 Memory.c -- OSMemMalloc OSMemCalloc

--------------------------------------------- -- 時間:2018-11-13 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] -- 若大神不吝拋磚,小菜感激不盡! ---------------------

[JavaMail] MultipartBody

轉: http://blog.itpub.net/15182208/viewspace-730172/   A、簡介   Message表示一個郵件,messgaes.getContent()返回一個Multipart物件。一個Multipart物件包含