UIWebView、WKWebViewの使用の詳細とパフォーマンス分析
10964 ワード
一、全体紹介
UIWebViewはiOS 2からあり、WKWebViewはiOS 8からあり、WKWebViewが不器用なUIWebViewに取って代わることは間違いない.簡単なテストでは、UIWebViewがメモリを消費しすぎ、メモリのピークが誇張されていることがわかります.WKWebViewWebページのロード速度も向上していますが、メモリほど向上していません.その他のメリットを以下に示します.より多くのHTML 5をサポートする機能 公式に発表された60 fpsまでのスクロールリフレッシュ率と内蔵ジェスチャー Safari同じJavaScriptエンジン UIWebViewDelegateとUIWebViewを14クラスと3つのプロトコル(公式ドキュメントの説明) に分割は別途使用することが多く、ロード進捗属性を増加する: 二、UIWebView使用説明
1.例:簡単な使用
UIWebViewは非常に使いやすく、3つのステップに分けることができ、最も簡単な使い方でもあり、Webページを表示します.
2.いくつかの実用的な関数ロード関数
UIWebViewはHTMLページをロードするだけでなく、pdf、word、txt、各種画像などの表示もサポートします.以下、macデスクトップ上のpngピクチャ:/Users/cs/desktop/iconをロードします.pngを例に Webナビゲーション更新関連関数
3.エージェントプロトコル使用:UIWebViewDelegate
全部で4つの方法があります Webページのロードを許可するかどうか、jsが開くurlを取得するかどうか、このurlを切り取ることでjsと対話する . Webページのロードを開始 Webロード完了 Webロードエラー
4.jsとのインタラクション
主に2つの方面があります:jsはOCコードを実行して、ocは書いたjsコードを呼び出します js実行OCコード:jsはocコードを実行できないが、変相して実行することができ、jsは実行する操作をネットワーク要求にカプセル化し、ocはこの要求をブロックし、urlの中の文字列解析を取得すればよい.ここではエージェントプロトコルの-(BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebView NavigationType)navigationType関数を用いる. oc書き上げたjsコードを呼び出す:ここではUIwebviewの1つの方法を用いる.stringByEvaluatingJavaScriptFromString、サンプルコード1つはウェブページの位置付け、1つはウェブページのtitle: を取得する
三.WKWebViewの使用説明
1.簡単に使う
UIWebviewと同様に、インポート(#import)を覚えるには3つのステップしかかかりません.
2.いくつかの実用的な関数は、UIWebviewに比べてローカルリソースファイルをロードし、WKWebViewも様々なファイルフォーマットをサポートし、loadFileURL関数を追加し、その名の通りローカルファイルをロードします. 他の3つのロード関数 Webナビゲーション更新関連関数 UIWebviewとほぼ同じで、異なるのは戻り値、WKNavigation(更新済み)、さらに関数reloadFromOriginとgoToBackForwardListItemを追加したことです.
(1)reloadFromOriginは、ネットワークデータに変化があるかどうかを比較し、変化がない場合はキャッシュを使用します.そうでない場合は、新しいリクエストから使用します.(2)goToBackForwardListItem:前より後ろよりも強く、特定の履歴ページにジャンプできます一般的なプロパティ allowsBackForwardNavigationGestures:BOOLタイプ、左右のストロークジェスチャーナビゲーションを許可するかどうか、デフォルトでは は許可されていません estimatedProgress:ロード進捗、取値範囲0~1 title:ページtitle .scrollView.scrollEnabled:上下スクロールが許可されているかどうか、デフォルトでは が許可されています. backForwardList:WKBackForwardListタイプ、アクセス履歴リスト、前進後退ボタンでアクセス可能、またはgoToBackForwardListItem関数で指定ページ にジャンプ可能
3.エージェントプロトコルの使用
3つのエージェント契約があります. WKNavigationDelegateが最も一般的で、UIWebViewDelegate機能と同様に、ロードが許可されているかどうか、ロードの開始、ロードの完了、ロードの失敗があるかどうかを追跡します.以下では、関数について簡単に説明し、呼び出しの前後順序を数値で示します.1-2-3-4-5 3つの関数をロードできますか?
トレース・ロード・プロシージャ関数: WKScriptMessageHandlerが実現しなければならない関数は、APPがjsと対話し、Webページからメッセージを受信するコールバック方法 を提供することである. WKUIdelegate UIインタフェース関連、オリジナルコントロールサポート、3種類のプロンプトボックス:入力、確認、警告.まずwebプロンプトボックスをブロックしてから処理します.
四.UIWebViewとWKWebViewのパフォーマンス分析
iOS 8はWKWebViewと関連する特性を発表し、開発者にどれだけの性能を向上させるかを教え、WKWebViewの性能がどれだけ良いかを実測します.
比較するとWKWebviewはpersistent常駐メモリではあまり使われていないことがわかりました
五.iOS H 5性能監視技術角度分析
パフォーマンスデータの理解
モバイル端末H 5の性能データを分析し、まずどの性能データであるかを説明する.ホワイトスクリーン時間ホワイトスクリーン時間アンドロイドでもiOSでもWebページをロードする際に存在する問題は、現在解決できません. ページ消費時間ページ消費時間とは、ページ全体のloadが完了するとレンダリングが完了するまで、このページをロードし始める時間を指す.リンクをロードするいくつかの性能データ、リダイレクト時間、DNS解析時間、TCPリンク時間、request要求時間 response応答時間domノード解析時間、pageレンダリング時間、リソースタイミングデータのキャプチャも必要です. リソースタイミングデータとは?各ページには多くのリソースが構成されています.js、.png、.css、.scriptなど、これらの各リソースリンクの時間を費やして、どのようなタイプのリソース、完全なリンクなのかを手に入れる必要があります.お客様にとっては、これらが十分ではありません.JSエラー、ページのajaxリクエストも必要です.JSエラーはもちろんスタック情報とエラータイプを取得します.ajaxリクエストは、一般に、3つの時間、応答時間、ajaxダウンロード時間、ajaxコールバック時間を取得する.
以上、モバイル端末H 5の性能データを取得できるように分析したが、これらのデータをどのように取得するかは後述する.データ取得にはjsが必要で、モバイル側がwebViewを通じてウェブページをロードしていることを知っています.jsの中でperformanceというインタフェースを通じてwebView内部apiから上のデータを取得することができ、jsが取得したデータはOCに送信されます.では、JSはどのようにしてこれらのデータを手に入れることができますか.これが最も重要です.OCコードはどのように書いてJSにデータを取得させることができますか.
本稿では、#UIWebView、WKWebViewの使用の詳細と性能点を参考に、著者に感謝する.
UIWebViewはiOS 2からあり、WKWebViewはiOS 8からあり、WKWebViewが不器用なUIWebViewに取って代わることは間違いない.簡単なテストでは、UIWebViewがメモリを消費しすぎ、メモリのピークが誇張されていることがわかります.WKWebViewWebページのロード速度も向上していますが、メモリほど向上していません.その他のメリットを以下に示します.
estimatedProgress
1.例:簡単な使用
UIWebViewは非常に使いやすく、3つのステップに分けることができ、最も簡単な使い方でもあり、Webページを表示します.
- (void)simpleExampleTest {
// 1. webview, ,"20"
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
// 2.
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/mddblog/"]];
// 3.
[webView loadRequest:request];
// 4. webView
[self.view addSubview:webView];
}
2.いくつかの実用的な関数
- (void)loadRequest:(NSURLRequest *)request;
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
UIWebViewはHTMLページをロードするだけでなく、pdf、word、txt、各種画像などの表示もサポートします.以下、macデスクトップ上のpngピクチャ:/Users/cs/desktop/iconをロードします.pngを例に
// 1. url
NSURL *url = [NSURL fileURLWithPath:@"/Users/cs/Desktop/icon.png"];
// 2.
NSURLRequest *request=[NSURLRequest requestWithURL:url];
// 3.
[self.webView loadRequest:request];
//
- (void)reload;
//
- (void)stopLoading;
//
- (void)goBack;
//
- (void)goForward;
//
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
//
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
//
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
3.エージェントプロトコル使用:UIWebViewDelegate
全部で4つの方法があります
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *urlString = [[request URL] absoluteString];
urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];
NSLog(@"urlString=%@---urlComps=%@",urlString,urlComps);
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView {
NSURLRequest *request = webView.request;
NSLog(@"webViewDidStartLoad-url=%@--%@",[request URL],[request HTTPBody]);
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSURLRequest *request = webView.request;
NSURL *url = [request URL];
if ([url.path isEqualToString:@"/normal.html"]) {
NSLog(@"isEqualToString");
}
NSLog(@"webViewDidFinishLoad-url=%@--%@",[request URL],[request HTTPBody]);
NSLog(@"%@",[self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]);
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSURLRequest *request = webView.request;
NSLog(@"didFailLoadWithError-url=%@--%@",[request URL],[request HTTPBody]);
}
4.jsとのインタラクション
主に2つの方面があります:jsはOCコードを実行して、ocは書いたjsコードを呼び出します
// js , htmlLocationID ( js ), ,
NSString *javascriptStr = [NSString stringWithFormat:@"window.location.href = '#%@'",htmlLocationID];
// webview
[self.webView stringByEvaluatingJavaScriptFromString:javascriptStr];
// title
NSString *title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]
三.WKWebViewの使用説明
1.簡単に使う
UIWebviewと同様に、インポート(#import)を覚えるには3つのステップしかかかりません.
- (void)simpleExampleTest {
// 1. webview, ,"20"
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
// 2.
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/mddblog/"]];
// 3.
[webView loadRequest:request];
// webView
[self.view addSubview:webView];
}
2.いくつかの実用的な関数
/// mac
- (void)loadLocalFile {
// 1. webview, ,"20"
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
// 2. url userName:
NSURL *url = [NSURL fileURLWithPath:@"/Users/userName/Desktop/bigIcon.png"];
// 3.
[webView loadFileURL:url allowingReadAccessToURL:url];
// webView
[self.view addSubview:webView];
}
- (WKNavigation *)loadRequest:(NSURLRequest *)request;
- (WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
- (WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
(1)reloadFromOriginは、ネットワークデータに変化があるかどうかを比較し、変化がない場合はキャッシュを使用します.そうでない場合は、新しいリクエストから使用します.(2)goToBackForwardListItem:前より後ろよりも強く、特定の履歴ページにジャンプできます
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward;
- (WKNavigation *)goBack;
- (WKNavigation *)goForward;
- (WKNavigation *)reload;
- (WKNavigation *)reloadFromOrigin; //
- (WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item; //
- (void)stopLoading;
3.エージェントプロトコルの使用
3つのエージェント契約があります.
/// ( redirect),
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
/// 3 , response , 。decisionHandler , , WKNavigationActionPolicyCancel ,WKNavigationActionPolicyAllow
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
/// 1 ,
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
トレース・ロード・プロシージャ関数:
/// 2
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
/// 4
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
/// 5
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
///
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
/// message: .
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
/// WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
///
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;
///
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
///
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
四.UIWebViewとWKWebViewのパフォーマンス分析
iOS 8はWKWebViewと関連する特性を発表し、開発者にどれだけの性能を向上させるかを教え、WKWebViewの性能がどれだけ良いかを実測します.
比較するとWKWebviewはpersistent常駐メモリではあまり使われていないことがわかりました
五.iOS H 5性能監視技術角度分析
パフォーマンスデータの理解
モバイル端末H 5の性能データを分析し、まずどの性能データであるかを説明する.
以上、モバイル端末H 5の性能データを取得できるように分析したが、これらのデータをどのように取得するかは後述する.データ取得にはjsが必要で、モバイル側がwebViewを通じてウェブページをロードしていることを知っています.jsの中でperformanceというインタフェースを通じてwebView内部apiから上のデータを取得することができ、jsが取得したデータはOCに送信されます.では、JSはどのようにしてこれらのデータを手に入れることができますか.これが最も重要です.OCコードはどのように書いてJSにデータを取得させることができますか.
本稿では、#UIWebView、WKWebViewの使用の詳細と性能点を参考に、著者に感謝する.