美文网首页
Swift 原生与webview交互

Swift 原生与webview交互

作者: 嘿_小小小 | 来源:发表于2018-05-25 13:40 被阅读23次

    日常开发中,我们经常要在app中嵌入webview, 在此介绍一下原生与webview的交互,用到的是WKWebView

    1. 创建WKWebView
    
    //引入框架
    import WebKit
    class WebDetailViewController: UIViewController,WKScriptMessageHandler,WKNavigationDelegate,WKUIDelegate {
      var wkWebview : WKWebView?
      override func viewDidLoad() {
          super.viewDidLoad()
           //地址:
          let url = URL.init(string: "https://www.baidu.com")
          //请求:
          let request = URLRequest(url: url!);
           // 用户交互信息管理
           let userContent = WKUserContentController.init()
           //Touchealth 可以自定义,主要为了和h5交互提供标识
           userContent.add(self, name: "Touchealth")
           /*
           js端直接使用以下代码发送消息给原生
           window.webkit.messageHandlers.Touchealth.postMessage(message);
           */
          
          //初始化
           let config = WKWebViewConfiguration.init();
           config.userContentController = userContent;
           self.wkWebview = WKWebView.init(frame:CGRect.init(x: 0, y: 0, width: SCREENWIDTH, height: SCREENHEIGHT==812 ? SCREENHEIGHT-88 : SCREENHEIGHT-64), configuration: config);
            
           self.view.addSubview(self.wkWebview!);
          //不要忘记实现代理
           self.wkWebview?.navigationDelegate = self;
           self.wkWebview?.uiDelegate = self;
           self.wkWebview?.load(request)
           self.wkWebview?.sizeToFit()
    
            //添加进度观察者  为了实现顶部加载提示条
            if self.wkWebview != nil {
                 self.wkWebview?.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil);
            }
      }
    
    }
    
    
    1. 代理方法 调用js 方法 发送数据给 webview, 实现传送登录token,领取代金券的id等信息。 传送的信息格式 可以和 web开发人员自己定。
      func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            //发送消息给web
            //这里只发送系统版本iOS
            let jsFunc = "appDidSendData('iOS')"
            self.wkWebview?.evaluateJavaScript(jsFunc, completionHandler: nil);
            //可以自定义数据格式:
            // let data = {"token": "dsjkk","platform" : "iOS"}
            //要把data转为 字符串   
       
        }
    
    1. web端接收数据 和发送数据
      
      //web端实现以下方法
     function appDidSendData(data){
       //把app端传过来的data转为json对象
       //do someting 逻辑处理 登录状态处理等
     }
      
      //发送数据
      var message = { 
          "id" : 100
           ...
     }
      window.webkit.messageHandlers.Touchealth.postMessage(message);
    
    
    1. app端接收web端数据(通过代理方法)
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
          //message.body 即为web端传送数据
          //转换message.body使用
    }
    
    1. 创建 进度条
     //通过观察者模式监听
     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
           if keyPath == "estimatedProgress"{
               self.progressView?.setProgress(Float((self.wkWebview?.estimatedProgress)!), animated: true);
               if (self.wkWebview?.estimatedProgress)! >= Double(1){
                   // self.autherView.alpha = 1
                   UIView.animate(withDuration: 0.3, delay: 0.5, options: .curveEaseInOut, animations: {
                       self.progressView?.alpha = 0;
                   }, completion: { (finished) in
                       self.progressView?.progress = 0;
                   })
               }
           }
           
       }
       
       func createProgressView (){
           self.progressView = UIProgressView.init(frame: CGRect.init(x: 0, y: 0, width: SCREENWIDTH, height: 3));
           self.progressView?.progressTintColor = UIColor.hexadecimalColor(hexadecimal: "#8c8c8c");//改变 变长那部分颜色;
           self.progressView?.trackTintColor = UIColor.clear;//改变背景色
           self.progressView?.progress = 0;
           self.view.addSubview(self.progressView!);
       }
    //最后别忘了移除观察者
    

    相关文章

      网友评论

          本文标题:Swift 原生与webview交互

          本文链接:https://www.haomeiwen.com/subject/jpeyjftx.html