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プロキシイベント
  • //          
    -(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を置いてイベント効果を試してみてください.