CNWebViewController.swift 14.2 KB
//
//  CNWebViewController.swift
//  metaCode
//
//  Created by zx on 2023/9/21.
//

import Foundation
import WebKit
import WebViewJavascriptBridge
import CNLiveShareToolKit
import CommonCrypto
import CNLiveBusinessTools
import SKPhotoBrowser


let WjjH5 = "wjjh5.cnlive.com"
let ManageshopH5 = "manageshop.cnlive.com"

class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
    
    var bridge:WKWebViewJavascriptBridge?
    var currentUrl:String = ""//当前网页的url
    
    lazy var webView: CNWebView = {
        let configuration = WKWebViewConfiguration()
        configuration.allowsInlineMediaPlayback = true
        let preferences = WKPreferences()
        preferences.javaScriptCanOpenWindowsAutomatically = true
        preferences.javaScriptEnabled = true
        configuration.preferences.minimumFontSize = 0.0
        configuration.preferences = preferences
        configuration.userContentController = WKUserContentController()
        let webView = CNWebView(frame: CGRectMake(0, 0, Width, Height), configuration: configuration, url: _url)
//        let webView = WKWebView(frame: CGRectMake(0, 0, Width, Height), configuration: configuration)
        webView.cnWebView.scrollView.showsVerticalScrollIndicator = false
        webView.cnWebView.scrollView.showsHorizontalScrollIndicator = false
        webView.isCNWebController = true
        return webView
    }()
    
    lazy var moreNavBtn: UIButton = {
        let moreNavBtn = UIButton(type: .custom)
        moreNavBtn.frame = CGRect(x: 0, y: KStatusBarHeight, width: KNavigationHeight-KStatusBarHeight, height: KNavigationHeight-KStatusBarHeight)
        moreNavBtn.backgroundColor = .clear
        moreNavBtn.setImage(UIImage(named: "web_more"), for: .normal)
        moreNavBtn.addTarget(self, action: #selector(moreNavBtnAction), for: .touchUpInside)
        return moreNavBtn
    }()

    
    var _url:URL?
    var url:URL? {
        get{
            return _url
        }
        set{
            _url = newValue!
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationBarHidden = false
        self.view.addSubview(self.webView)
        self.webView.webControllerUpdateNavBlock = { isFinish , title,isDecidePolicy ,urlStr in
            if isFinish{
                self.titleName = title
            }else if isDecidePolicy{
                if urlStr.contains("&isWjjReport=true") || urlStr.contains("?isWjjReport=true"){
                    self.rightNavBtns = [self.moreNavBtn]
                    self.moreNavBtn.isHidden = false
                }else{
                    self.moreNavBtn.isHidden = true
                }
            }
        }
        webView.snp.makeConstraints { make in
            make.top.equalTo(get_system_nav_height())
            make.left.right.bottom.equalToSuperview()
        }
//        webView.cnWebView.evaluateJavaScript("navigator.userAgent") { [self] result, error in
//            let userAgent = result as! String
//            if error == nil && userAgent.count > 0 {
//                if !userAgent.contains(CNLiveMCEnvironmentManager.shared.base_web_UA) {
//                    let newUserAgent = userAgent + CNLiveMCEnvironmentManager.shared.base_web_UA
//                    webView.cnWebView.customUserAgent = newUserAgent
//                    
//                    if (_url != nil){
//                        let urlStr = self.checkURLWithStr(urlStr: _url!.absoluteString)
//                        self.currentUrl = urlStr
//
//                        webView.cnWebView.load(URLRequest.init(url:URL(string: urlStr)!))
//                    }
//                    self.configBridge()
//                    self.configBridgeRegister()
//                }
//            }
//        }
    }

//    func configBridge(){
//        WKWebViewJavascriptBridge.enableLogging()
//        self.bridge = WKWebViewJavascriptBridge(for: self.webView.cnWebView)
//        self.bridge?.setWebViewDelegate(self)
//    }
//    
//    func configBridgeRegister() -> Void {
//        //h5拉起原生分享 js call oc
//        self.bridge?.registerHandler("wjjylzgVideoShare", handler: { data, responseCallback in
////            print("js call oc\(data)")
//            let dic = data as! Dictionary<String, String>
//            CNLiveShareManager.showShareViewWithParam(forShareTitle: dic["title"], shareUrl: dic["shareUrl"], shareDesc: dic["subTitle"], shareImage: dic["cover"], screenFull: false, hiddenWjj: true, hiddenQQ: false, hiddenWB: true, hiddenLifeCircle: true, hiddenWechatCircle: false, hiddenWechat: false, hiddenSafari: true, formVC: self, topImage: [], topTitles: [], platformType: .all) { title in
//                
//            } completerBlock: { resultType, platformType, typeString in
//                if resultType == .succ{
//                    
//                }
//            }
//
//        })
//        
//        // 网页内容图片预览
//        self.bridge?.registerHandler("wjjPreviewImage", handler: { data, responseCallback in
//            //            print("js call oc\(data)")
//            var images = [SKPhoto]()
//            let dic = data as! Dictionary<String, Any>
//            let index = (dic["index"] as! NSString).integerValue
//            let imageArray = dic["imgArr"] as! NSArray
//            var imgArray = NSMutableArray()
//            for dict in imageArray {
//                var imgUrl = ""
//                if let dictemp = dict as? String{
//                    imgArray.add(dictemp)
//                    imgUrl = dictemp
//                }else if let dictemp = dict as? Dictionary<String, Any>{
//                    imgArray.add(dictemp["src"] ?? "")
//                    imgUrl = dictemp["src"] as! String
//                }
//                let photo = SKPhoto.photoWithImageURL(imgUrl)
//                photo.shouldCachePhotoURLImage = false
//                photo.photoURL = imgUrl
//                images.append(photo)
//            }
//            let browser = SKPhotoBrowser(photos: images)
//            browser.initializePageIndex(index)
//            currentViewController()?.present(browser, animated: true)
//
//        })
//    }

    //点击...分享获取h5参数oc call js
    func configBridgeCallHander() -> Void {
        self.webView.bridge?.callHandler("wjjClientGetShareParaFromJS", data: ["":""], responseCallback: { data in
//            print("js call oc\(data)")
            let dic = data as! Dictionary<String, String>
//            let shareType = dic["shareType"]
//            let contentIdStr = dic["activityId"]
            let title = dic["title"]
            let desc = dic["desc"]
            let shareImg = dic["shareImg"]

            var shareUrl = ""
            if let tempShareUrl = dic["shareUrl"]{
                if tempShareUrl == ""{
                    shareUrl = self.currentUrl
                }else{
                    shareUrl = tempShareUrl
                }
            }else{
                shareUrl = self.currentUrl 
            }
            
            CNLiveShareManager.showShareViewWithParam(forShareTitle: title, shareUrl: shareUrl, shareDesc: desc, shareImage: shareImg, screenFull: false, hiddenWjj: true, hiddenQQ: false, hiddenWB: true, hiddenLifeCircle: true, hiddenWechatCircle: false, hiddenWechat: false, hiddenSafari: true, formVC: self, topImage: [], topTitles: [], platformType: .all) { title in
                
            } completerBlock: { resultType, platformType, typeString in
                if resultType == .succ{
                    
                }
            }
        })
    }

//    func checkURLWithStr(urlStr:String) -> String{
//        if URL(string: urlStr)?.host != WjjH5 {
//            return urlStr//不是wjjh5不作处理
//        }
//        var str = urlStr
//        let date = Date()
//        let formatter = DateFormatter()
//        formatter.dateFormat = "yyyyMMdd"
//        let dateStr = formatter.string(from: date)
//        let sidStr = String(format: "%@%@", UserInfoManager.shared.userInfo.uid,dateStr)
//        let signStr = sidStr.crypt(operation:  CCOperation(kCCEncrypt), key: CNLiveMCEnvironmentManager.shared.appKey)
//        //看是 appKey还是appKeywjj
//        let sidSignStr = (signStr ?? "").isEmpty ?  "" : signStr
//        let sourceArray = str.components(separatedBy: "?")
//        let buildVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
//        let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
//        let uuid = CNLiveBusinessTools.getUidForStat(Date())
//        if sourceArray.count == 1{
//            //是wjjh5且无参数
//            str = String(format: "%@?shareSid=%@&sid=%@&plat=i&ver=%@&version=%@&wjjFrom=apple&wjjUUID=%@&appId=%@&voteId=%@&wjjToken=%@", str,UserInfoManager.shared.userInfo.uid,UserInfoManager.shared.userInfo.uid,buildVersion,appVersion,uuid,CNLiveMCEnvironmentManager.shared.appId,sidSignStr!,UserInfoManager.shared.userInfo.token)
//            return str
//        }
//        //是wjjh5且有参数
//        let paraArr = NSMutableArray(array: ["shareSid=","sid=","plat=","ver=","version=","wjjFrom=","wjjUUID=","appId=","voteId=","wjjToken="])
//        let valueArr = NSMutableArray(array:[UserInfoManager.shared.userInfo.uid,UserInfoManager.shared.userInfo.uid,"i",buildVersion,appVersion,"apple",uuid,CNLiveMCEnvironmentManager.shared.appId,sidSignStr!,UserInfoManager.shared.userInfo.token])
//        var i = 0
//        for paraStr in paraArr{
//            let tempStr = paraStr as! String
//            let paramStr = "&".appending(tempStr)
//            let paramStr2 = "?".appending(tempStr)
//
//            if str.contains(paramStr){
//                //包含则替换 &sid=
//                let lastStr = str.components(separatedBy: tempStr).last
//                let lastSeparatedStr = (lastStr?.components(separatedBy: "&").first)!
//                let oldStr = tempStr.appending(lastSeparatedStr)
//                let tempValueStr = tempStr.appending(valueArr[i] as! String)
//                str = str.replacingOccurrences(of: oldStr, with: tempValueStr)
//            }else if str.contains(paramStr2){
//                //包含则替换 &sid=
//                let lastStr = str.components(separatedBy: tempStr).last
//                let lastSeparatedStr = (lastStr?.components(separatedBy: "&").first)!
//                let oldStr = tempStr.appending(lastSeparatedStr)
//                let tempValueStr = tempStr.appending(valueArr[i] as! String)
//                str = str.replacingOccurrences(of: oldStr, with: tempValueStr)
//            }else{
//                //不包含则拼接
//                str = String(format: "%@&%@%@", str,tempStr,valueArr[i] as! String)
//            }
//            i = i + 1
//        }
//        return str
//    }

    // MARK: - BtnAction
    // 内部链接右上角···分享
    @objc func moreNavBtnAction(){
        self.configBridgeCallHander()
    }
    override func ClickBackBtn() {
        if self.webView.cnWebView.canGoBack{
            self.webView.cnWebView.goBack()
        }else{
            super.ClickBackBtn()
        }
    }
    
    // MARK: - WKWebViewDelegate
//    // 页面开始加载时调用
//    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
////        print("didStartProvisionalNavigation")
//    }
//    // 当内容开始返回时调用
//    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
////        print("didCommit")
//    }
//        
//    // 页面加载完成之后调用
//    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
////        print("didFinish")
//        titleName = webView.title!
//    }
//    // 页面加载失败时调用
//    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
////        print("didFailProvisionalNavigation")
//    }
//    // 接收到服务器跳转请求之后调用
//    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
////        print("didReceiveServerRedirectForProvisionalNavigation")
//    }
//    // 在收到响应后,决定是否跳转 -> 默认允许
//    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
//        
////        print("decidePolicyFornavigationResponse")
//                
//        //允许跳转
//        decisionHandler(.allow)
//        //不允许跳转
//        //        decisionHandler(.cancel)
//    }
//    // 在发送请求之前,决定是否跳转 -> 默认允许
//    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
////        print("decidePolicyFornavigationAction")
//        
//        var urlStr = (navigationAction.request.url?.absoluteString)!
//                
//        if navigationAction.request.url?.host == WjjH5 {
//
//            if urlStr.contains("&isWjjReport=true") || urlStr.contains("?isWjjReport=true"){
//                self.rightNavBtns = [self.moreNavBtn]
//                self.moreNavBtn.isHidden = false
//            }else{
//                self.moreNavBtn.isHidden = true
//            }
//            
//            urlStr = self.checkURLWithStr(urlStr: urlStr)
//            self.currentUrl = urlStr
//        }
//        
//        if navigationAction.navigationType == .other{
//            //跳转Appstore
//            let url = URL(string: "https://apps.apple.com/cn/app/%E7%BD%91%E5%AE%B6%E5%AE%B6%E5%95%86%E5%AE%B6%E7%89%88/id1337575497")
//            if url == navigationAction.request.url {
//                if UIApplication.shared.canOpenURL(url!) { UIApplication.shared.open(url!, options: [:], completionHandler: nil)
//                }
//            }
//        }else if navigationAction.navigationType == .linkActivated{
//            
//            //以后可判断h5地址 ,可跳转原生页面或网页
//            //暂时只跳h5
//            let webVC =  CNWebViewController()
//            webVC.url = URL(string: urlStr)
//            navigationViewController().pushViewController(webVC, animated: pushAnimated)
//            decisionHandler(.cancel)
//            return
//
//        }
//        decisionHandler(.allow)
//    }
}