IOS上級エンジニアの成長の道--基礎編『WKWebView』
6501 ワード
現在、ほとんどのappはiOS 8以上のシステムしかサポートされていないので、H 5へのアクセス時に最新のWKWebViewだけを利用することができます.
WKWebViewのメリット性能は高くて、安定性は良くて、占有するメモリは比較的に小さくて、 JSインタラクション をサポート HTML 5の新機能 をサポートは進捗バーを追加することができます(しかし、卵を並べて、使いにくくて、やはり第三者に慣れています). は組み込みジェスチャーをサポートし、 60 fpsまでのリフレッシュ周波数(カードなし) だそうです
次は直接テーマに入りますまずライブラリファイル をインポートする必要がある.
importは、2つのエージェントイベント を同時に継承する. WKWebViewの作成
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.99.81:8020/goldenWater/watersupermarketList.html[]]];self.webView.navigationDelegte=self;self.webView.UIdelegate=self;//サポートスライドを開いてself.webView.allowsBackForwardNavigationGestures=YES;[self.view addSubview:self.webView:self.webView];
WKUIdelegateプロキシイベント
-WKUIdelegateエージェントイベント、主にjsとのインタラクションを実現
左上の戻りボタンを書き換えることが重要で、ユーザー体験に大きな影響を与えます.
Webページのロードの進捗状況を表示する必要がある場合は、前の記事に移動します.
iOS WKWebViewは、Webページのロード進捗バーを表示します.ここでは基本的にH 5を埋め込むロードが実現します.
WKWebViewのメリット
次は直接テーマに入ります
import
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.99.81:8020/goldenWater/watersupermarketList.html[]]];self.webView.navigationDelegte=self;self.webView.UIdelegate=self;//サポートスライドを開いてself.webView.allowsBackForwardNavigationGestures=YES;[self.view addSubview:self.webView:self.webView];
//
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
}
//
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
}
//
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{// ,
self.title = webView.title;
}
//
- (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{
DLog(@"%@",webView);
DLog(@"%@",navigationResponse);
WKNavigationResponsePolicy actionPolicy = WKNavigationResponsePolicyAllow;
// ,
decisionHandler(actionPolicy);
}
// ,
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
self.title = webView.title;
WKNavigationActionPolicy actionPolicy = WKNavigationActionPolicyAllow;
if (navigationAction.navigationType==WKNavigationTypeBackForward) {//
// , 。
self.navigationItem.leftBarButtonItems = @[self.backBtn, self.closeBtn];
//
// if (webView.backForwardList.backList.count>0) { // list
// DLog(@"%@",webView.backForwardList.backList);
// DLog(@"%@",webView.backForwardList.currentItem);
// WKBackForwardListItem * item = webView.backForwardList.currentItem; // list
// for (WKBackForwardListItem * backItem in webView.backForwardList.backList) { // ,
// //
// [webView goToBackForwardListItem:[webView.backForwardList.backList firstObject]];
// }
// }
}
// ,
decisionHandler(actionPolicy);
}
-WKUIdelegateエージェントイベント、主にjsとのインタラクションを実現
// JS Alert( JS )
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
DLog(@" alert");
DLog(@"%@",message);
DLog(@"%@",frame);
[self.view makeToast:message];
completionHandler();
}
// ( JS )
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler{
DLog(@" ");
DLog(@"%@",prompt);
DLog(@"%@",defaultText);
DLog(@"%@",frame);
UIAlertController *alert = [UIAlertController alertControllerWithTitle:prompt message:defaultText preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *a1 = [UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
//
completionHandler(@"");
}];
UIAlertAction *a2 = [UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
DLog(@"%@",
[alert.textFields firstObject].text);
completionHandler([alert.textFields firstObject].text);
}];
[alert addAction:a1];
[alert addAction:a2];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
DLog(@"%@",textField.text);
}];
[self presentViewController:alert animated:YES completion:nil];
}
// (JS )
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler{
DLog(@" ");
DLog(@"%@",message);
DLog(@"%@",frame);
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
completionHandler(NO);
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
completionHandler(YES);
}];
[alertController addAction:cancelAction];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
左上の戻りボタンを書き換えることが重要で、ユーザー体験に大きな影響を与えます.
-(void)backNative{
// H5
if ([self.webView canGoBack]) {
//
[self.webView goBack];
//
self.navigationItem.leftBarButtonItems = @[self.backBtn, self.closeBtn];
} else {
[self closeNative];
}
}
Webページのロードの進捗状況を表示する必要がある場合は、前の記事に移動します.
iOS WKWebViewは、Webページのロード進捗バーを表示します.ここでは基本的にH 5を埋め込むロードが実現します.
http://m.jd.com
を置いてイベント効果を試してみてください.