iOS WKWebView基本使用

6696 ワード

現在、ほとんどの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.navigationDelegate = self;
        self.webView.UIDelegate = self;
        //        
        self.webView.allowsBackForwardNavigationGestures = YES;
        [self.view addSubview:self.webView];
    
  • WKUIdelegateプロキシイベント
  • //          
    -(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を置いてイベント効果を試してみることができます
    サンプル図
    【オリジナル出品無許可転載禁止】【微友分享転送禁止公号等無許可転載を歓迎】