iOS swift WKWebview 显示pdf

115 阅读1分钟
//

//  LZPDFWebController.swift
//
//  Created by LiZhi on 
//


**import** UIKit

 **import** QuickLook

/// PDF 查看 webview 

**class** LZPDFWebController: UIViewController {

    **public** **var** webUrl: String?

     **lazy** **var** wkWebView: WKWebView = {

        **let** webView = WKWebView(frame: **self**.view.bounds)

         webView.navigationDelegate = **self******

        **return** webView

    }()

 
    ///加载进度条
    **private** **lazy** **var** progressView: UIProgressView  = {

        **let** progressV = UIProgressView(frame: CGRect(x: 0, y: kNavigationHeight, width: kScreenWidth, height: 2))

        progressV.backgroundColor = UIColor.lightText

//        progressV.transform = CGAffineTransformMakeScale(1.0, 1.5)

        progressV.isHidden = **true******

        **return** progressV

    }()

    

    **override** **init**(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {

        **super**.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

        **self**.setup()

    }

    

    **required** **init**?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    **deinit** {
        **self**.removeObserve()

    }
    **override** **func** viewDidLoad() {

        **super**.viewDidLoad()

        **self**.reloadUrl(**self**.webUrl)

        **self**.bbm_addSubviews()

        **self**.addObserve()

    }


    **public** **func** reloadUrl(_ url: String?) {

        print("--- pure webController = url ",url)

        **guard** **let** urlStr = url,

        **let** uRL = URL(string: urlStr)  **else** {

            **return******

        }

        **let** urlRequest = URLRequest(url: uRL)

        

        **self**.wkWebView.load(urlRequest)

        

    }

    

    **override**  **func** observeValue(forKeyPath keyPath: String?, of object: **Any**?, change: [NSKeyValueChangeKey: **Any**]?, context: UnsafeMutableRawPointer?) {

        **if** keyPath == "estimatedProgress" {

            //**TODO: -- <##>******

           **let** progress =  **self**.wkWebView.estimatedProgress

            print("------ progress = ",progress)

            **self**.progressView.progress = Float(**self**.wkWebView.estimatedProgress)

            **if** **self**.progressView.progress == 1 {

                **self**.progressView.isHidden = **true******

            }

        }**else** **if** keyPath == "title"{

            // 更新iOS应用程序中的标题

            **self**.navigationBar.title = **self**.wkWebView.title

        } **else** {

            **super**.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)

        }

    }

    

    **private** **func** setup()  {

        **self**.openType = .push

    }

    

    **private** **func** addObserve(){

        **self**.wkWebView.addObserver(**self**, forKeyPath: "estimatedProgress", options: .new, context: **nil**)

        **self**.wkWebView.addObserver(**self**, forKeyPath: "title", options: .new, context: **nil**)

    }

    **private** **func** removeObserve()  {

        **self**.wkWebView.removeObserver(**self**, forKeyPath: "estimatedProgress")

        **self**.wkWebView.removeObserver(**self**, forKeyPath: "title")

    }


}

  


// **MARK: - WKNavigationDelegate******

  


**extension** BBPDFWebController: WKNavigationDelegate {

    // 开始加载

    **func** webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {

        print("---- 开始加载网页")

        //开始加载网页时展示出progressView

        **self**.progressView.isHidden = **false******

//        self.progressView.transform = CGAffineTransformMakeScale(1.0, 1.5);

    }

    

    // 加载完成

    **func** webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        print("---- 加载完成")

        **self**.progressView.isHidden = **true******

    }

  


    // 加载失败

    **func** webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: **any** Error) {

        print("---- 加载失败")

        **self**.progressView.isHidden = **true******

    }

    // 在发送请求之前,决定是否跳转

    **func** webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction) **async** -> WKNavigationActionPolicy {

        **return** .allow

    }

    // 在收到响应后,决定是否跳转

    **func** webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse) **async** -> WKNavigationResponsePolicy {

        **guard** **let** uRL = navigationResponse.response.url,

              **let** webUrl = **self**.webUrl **else** {

            **return** .allow

        }

        **let** data: Data? = **try**? Data(contentsOf: uRL)

        **guard** **let** data = data ,

              **let** webURL = URL(string: webUrl)  **else** {

            **return** .allow

        }

        // 解决乱码 https://www.jianshu.com/p/340982311f09

        **self**.wkWebView.load(data, mimeType: "application/pdf", characterEncodingName: "UTF-8", baseURL: webURL)

        //解决pdf 加载不出来

        **return** .allow

    }


}