CNWebView.swift 28.4 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
//
//  CNWebView.swift
//  metaCode
//
//  Created by zx on 2024/2/1.
//

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

//返回 Web控制器回调
typealias cnWebControllerBackNavBlock = ()->Void

//更新Web控制器导航回调
typealias cnWebControllerUpdateNavBlock = (_ isFinish:Bool , _ titleName:String ,_ isDecidePolicy:Bool , _ urlStr:String)->Void
typealias cnWebControllerUpdateNavSoundBlock = (_ isShowSound:Bool )->Void
typealias cnWebControllerUpdateNavEditBlock = (_ isShowEdit:Bool)->Void


//更新Web控制器 currentUrl
typealias cnWebControllerUpdateCurrentUrlBlock = (_ currentUrl:String)->Void

class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler,WKUIDelegate{
    
    var configuration:WKWebViewConfiguration?
    
    lazy var cnWebView :WKWebView = {
        let cnWebView = WKWebView(frame: self.bounds, configuration: self.configuration!)
        cnWebView.uiDelegate = self
        return cnWebView
    }()

    var _webUrl:URL?//初始URL
    var webUrl:URL?{
        get{
            _webUrl
        }set{
            _webUrl = newValue!
        }
    }
    
    var currentUrl:String = ""//当前网页的url
    var bridge:WKWebViewJavascriptBridge?
    var customUserAgent:String = ""
    
    //CNWebController
    var isCNWebController:Bool = false//是否网页控制器
    var webControllerBackNavBlock:cnWebControllerBackNavBlock?//back返回

    var webControllerUpdateNavBlock:cnWebControllerUpdateNavBlock?//刷新
    var webControllerUpdateNavSoundBlock:cnWebControllerUpdateNavSoundBlock?//是否显示自动播放开关
    var webControllerUpdateNavEditBlock:cnWebControllerUpdateNavEditBlock?// 是否显示编辑
        
    var webControllerUpdateCurrentUrlBlock:cnWebControllerUpdateCurrentUrlBlock?
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func loadUrl(url:String){
        let urlStr = self.checkURLWithStr(urlStr: url)
        self.currentUrl = urlStr
        self.cnWebView.load(URLRequest.init(url:URL(string: urlStr)!))
    }
    
    init(frame: CGRect, configuration: WKWebViewConfiguration ,url:URL?) {
        super.init(frame: frame)
        self.configuration = configuration
        self.addSubview(self.cnWebView)
        self.webUrl = url
        self.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
                    self.cnWebView.customUserAgent = newUserAgent
                    self.customUserAgent = newUserAgent
                    
                    if (self.webUrl != nil){
                        let urlStr = self.checkURLWithStr(urlStr: self.webUrl!.absoluteString)
                        self.currentUrl = urlStr

                        self.cnWebView.load(URLRequest.init(url:URL(string: urlStr)!))
                        self.configBridge()
                        self.configBridgeRegister()
                        self.webViewAddScriptMessageHandler()
                    }
                }
            }
        }
    }
    
    // MARK: - 电商h5的交互回调调用
    //电商 js 交互原生
    func webViewAddScriptMessageHandler(){
        self.cnWebView.configuration.userContentController.add(self, name: "pop")
        self.cnWebView.configuration.userContentController.add(self, name: "toShare")
        self.cnWebView.configuration.userContentController.add(self, name: "openAppPayment")
    }
    
    func webViewRemoveScriptMessageHandler(){
        self.cnWebView.configuration.userContentController.removeScriptMessageHandler(forName: "pop")
        self.cnWebView.configuration.userContentController.removeScriptMessageHandler(forName: "toShare")
        self.cnWebView.configuration.userContentController.removeScriptMessageHandler(forName: "openAppPayment")
    }
    //电商h5的回调
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        // 初始化 body 为 nil
        var body: Any? = nil
        // 检查 message.body 是否不是 NSNull 并且是 NSDictionary 的实例
        if let dictionary = message.body as? [String: Any], !dictionary.isEmpty {
            // 获取所有的键
            let allKeys = dictionary.keys
            // 检查是否包含 "body" 键
            if allKeys.contains("body") {
                // 取出 "body" 键对应的值
                body = dictionary["body"]
            }
        }
        if message.name == "openAppPayment" {
            // 跳转支付页面
            if let json = body as? [String: Any] {
                // 检查 json 是否非空
                guard !json.isEmpty else {
                    print("json 字典是空的")
                    return
                }
                // 使用可选链获取 orderNumber,如果不存在则返回空字符串
                let orderNumber = json["orderNumber"] as? String ?? ""
                let vc = CNLiveShopPayController(orderNumber: orderNumber)
                vc.finishPayCallBack = { [weak self]  orderInfoModel ,payType ,payResult in
                    let params = NSMutableDictionary()
                    let jsonStr = orderInfoModel.toJSONString() ?? ""
                    params.setValue(jsonStr, forKey: "orderInfo")
                    params.setValue(payType.hashValue, forKey: "payType")
                    params.setValue(payResult.hashValue, forKey: "payResult")
                    
                    let sparams = self!.stringByJson(params as? [String : Any])
                    let appPaymentCallbackJS = String(format: "appPaymentCallback('%@')", sparams ?? "")
                    self?.cnWebView.evaluateJavaScript(appPaymentCallbackJS, completionHandler: { result, error in
//                        print("error \(error)")
                    })
                }
                // 跳转支付页面
                currentViewController()?.navigationController?.pushViewController(vc, animated: pushAnimated)
            }
        }else if message.name == "pop" {
            //返回上一级控制器
            if self.cnWebView.canGoBack{
                self.cnWebView.goBack()
            }else{
                self.webControllerBackNavBlock?()
            }
        }else if message.name == "toShare" {
            //拉起分享
            if let json = body as? [String: Any] {
                // 检查 json 是否非空
                guard !json.isEmpty else {
                    print("json 字典是空的")
                    return
                }
                // 使用可选链和条件绑定获取 type,如果不存在或不是数字,则使用默认值 0
                let type: UInt = (json["type"] as? NSNumber)?.uintValue ?? 0
                // 使用可选链获取 id 和 ext,如果不存在则返回空字符串
                let targetId = json["id"] as? String ?? ""
                let ext = json["ext"] as? String ?? ""
                //请求分享参数
                showLoading(message: "")
                CNLiveShoph5ViewModel.postGetShareDataWithType(type: NSInteger(type), targetId: targetId, ext: ext) { result, status in
                    let shareModel = result as! CNLiveShopCommentRequestShareModel
                    
                    let shareTitle = shareModel.share_title
                    let shareUrl = shareModel.url
                    let shareDesc = shareModel.share_desc
                    let shareImage = shareModel.share_img
                    CNLiveShareManager.showShareViewWithParam(forShareTitle: shareTitle, shareUrl: shareUrl, shareDesc: shareDesc, shareImage: shareImage, screenFull: false, hiddenWjj: true, hiddenQQ: false, hiddenWB: true, hiddenLifeCircle: true, hiddenWechatCircle: false, hiddenWechat: false, hiddenSafari: true, formVC: currentViewController(), topImage: [], topTitles: [], platformType: .all) { title in
                        
                    } completerBlock: { resultType, platformType, typeString in
                        if resultType == .succ{
                            
                        }
                    }

                }
                
            }
        }
    }
    // MARK: - 字典转字符串
    func stringByJson(_ json: [String: Any]?) -> String? {
        guard let json = json else {
            return nil
        }
          
        do {
            let data = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
            if let string = String(data: data, encoding: .utf8) {
                // 去掉字符串中的空格
                let stringWithoutSpaces = string.replacingOccurrences(of: " ", with: "", options: .literal, range: nil)
                  
                // 去掉字符串中的换行符
                let stringWithoutNewlines = stringWithoutSpaces.replacingOccurrences(of: "\n", with: "", options: .literal, range: nil)
                  
                // 去掉字符串中的转义字符 "\"
                // 注意:在标准的JSON字符串中,转义字符 "\" 是必要的,因此通常不会移除它们。
                // 如果你确实需要移除它们,请确保这样做不会导致JSON字符串格式错误。
                let stringWithoutEscapes = stringWithoutNewlines.replacingOccurrences(of: "\\", with: "", options: .literal, range: nil)
                  
                return stringWithoutEscapes
            }
        } catch {
            // 处理JSONSerialization的错误
            return nil
        }
          
        return nil
    }
    // MARK: - wjjh5的交互回调调用
    func configBridge(){
        WKWebViewJavascriptBridge.enableLogging()
        self.bridge = WKWebViewJavascriptBridge(for: self.cnWebView)
        self.bridge?.setWebViewDelegate(self)
    }
    //wjjh5拉起原生
    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: currentViewController(), 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
            let 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拉起原生 跳转微信小程序
        self.bridge?.registerHandler("wjjH5TurntoServices", handler: { data, responseCallback in
//            print("js call oc\(data)")
            let dic = data as! Dictionary<String, Any>
            let type = dic["type"] as! String
            if type == "103"{
                //跳转微信小程序
                let toDic = dic["to"] as! Dictionary<String, Any>
                let miniAppId = toDic["id"] as! String
                let miniPath = toDic["path"] as! String
                CNLiveShareImageManager.pushWeChatMiniProgrem(withMiniAppId: miniAppId, path: miniPath, extMsg: "", extDic: [:])
            }
        })
        
        //h5拉起原生跳转苹果内购
        self.bridge?.registerHandler("wjjHtmlPullApplePay", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dataDic = data as! Dictionary<String, Any>
            let body = dataDic["body"] as? String
            let notify_url = dataDic["notify_url"] as? String
            let orderId = dataDic["orderId"] as? String
            let prdId = dataDic["prdId"] as? String
            let total_fee = dataDic["total_fee"] as? Int
            print("拉起苹果内购")
            
            //苹果内购暂时报错 验证失败支付失败
            CNLivePayCostModule.showApplePayViw(withParamDict: dataDic, fromVC: currentViewController()!) {[weak self] result in
                if result == CNLivePayCostTypeResultSucc{
                    self?.bridge?.callHandler("wjjHtmlPullAppPayCallback", data: ["orderId":orderId,"payStatus":"0"], responseCallback: { responseData in
                        print("succ")
                    })
                }
                
            }
            
        })
        
        //h5拉起原生支付(iOS不加,虚拟付费视频都内购)
        self.bridge?.registerHandler("wjjHtmlPullAppPay", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dic = data as! Dictionary<String, Any>
            
//            [CNLivePayCostModule  showDefaultPayViwWithParamDict:htmlDict PayCostType:CNLivePayCostTypeHtml FromVC:formVC ResultBlock:^(CNLivePayCostTypeResult resultType) {
//                if (resultType == CNLivePayCostTypeResultSucc) {
//            NSString * orderId = [resultParam stringValueForKey:@"orderId" default:@""];
//            [weakSelf.bridge callHandler:@"wjjHtmlPullAppPayCallback" data:@{@"orderId":orderId,@"payStatus":payResult == CNLiveContentPayResultSucc?@"0":@"1"} responseCallback:^(id responseData) {
//                NSLog(@"成功");
//            }];
//                }
//            }];
            
        })
        
        //h5拉起原生跳转新webView
        self.bridge?.registerHandler("ymOpenNewWebview", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dic = data as! Dictionary<String, Any>
            if let urlStr = dic["url"] as? String{
                let webVC =  CNWebViewController()
                webVC.url = URL(string: urlStr)
                navigationViewController().pushViewController(webVC, animated: true)
            }
        })

        //h5拉起原生保存图片
        self.bridge?.registerHandler("ymSaveImage", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dic = data as! Dictionary<String, Any>
            if let urlStr = dic["src"] as? String{
                let photoManager = CNLivePhotoManager()
                photoManager.saveImageFromURL(url: URL(string: urlStr)!)
            }

        })
        //h5拉起原生分享图片
        self.bridge?.registerHandler("ymShareImage", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dic = data as! Dictionary<String, Any>
            if let urlStr = dic["src"] as? String{
                URLSession.shared.dataTask(with: URLRequest(url: URL(string: urlStr) ?? URL(fileURLWithPath: ""))) { data, response, error in
                    guard let data = data, error == nil else {
                        return
                    }
                      
                    DispatchQueue.main.async {
                        let image = UIImage(data: data)
                        CNLiveShareManager.showShareViewWithParam(forShareTitle: "", shareUrl: "", shareDesc:"", shareImage: image, screenFull: false, hiddenWjj: true, hiddenQQ: false, hiddenWB: true, hiddenLifeCircle: true, hiddenWechatCircle: false, hiddenWechat: false, hiddenSafari: true, formVC: currentViewController(), topImage: [], topTitles: [], platformType: .all) { title in
                            
                        } completerBlock: { resultType, platformType, typeString in
                            if resultType == .succ{
                                
                            }
                        }
                    }
                }.resume()
            }
        })
        
        //h5拉起原生 AI右上角是否显示编辑按钮
        self.bridge?.registerHandler("ymAiShowEditRoleBtn", handler: { data, responseCallback in
            print("js call oc\(data)")
            self.webControllerUpdateNavEditBlock?(true)
            //显示编辑按钮
            
        })
        //h5拉起原生 获取自动播放状态
        self.bridge?.registerHandler("ymAiGetAutoPlayAudioState", handler: { data, responseCallback in
            print("js call oc\(data)")
            
        })
        //h5拉起原生 跳转ugc播放页面
        self.bridge?.registerHandler("wjjJumpUGCAlbum", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dic = data as! Dictionary<String, Any>
            if let albumIdStr = dic["albumId"] as? String{
                //短剧-跳转短剧播放页
                navigationViewController().visibleViewController?.navigationController?.pushViewController(CNLiveShortVideoViewController(aid: albumIdStr), animated: pushAnimated)

            }
        })
        
        //h5拉起原生跳视频专辑
        self.bridge?.registerHandler("video://album", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dataDic = data as! Dictionary<String, Any>
            print("拉起视频专辑")
                        
        })
        //h5拉起原生跳视频单集
        self.bridge?.registerHandler("video://vod", handler: { data, responseCallback in
            print("js call oc\(data)")
            let dataDic = data as! Dictionary<String, Any>
            print("拉起视频单集")
                        
        })

    }
    
    // MARK: - 检查url
    func checkURLWithStr(urlStr:String) -> String{
        if URL(string: urlStr)?.host != WjjH5 {
            if URL(string: urlStr)?.host == ManageshopH5 || URL(string: urlStr)?.host == ManagemallshopH5{
                //是电商url,拼接uid
                var str = urlStr
                let sourceArray = str.components(separatedBy: "?")
                if sourceArray.count == 1{
                    //是电商h5且无参数
                    str = String(format: "%@?uid=%@", str,UserInfoManager.shared.userInfo.uid)
                    return str
                }
                //是电商h5且有参数
                let paraArr = NSMutableArray(array: ["uid="])
                let valueArr = NSMutableArray(array:[UserInfoManager.shared.userInfo.uid])
                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
            }else{
                return urlStr//不是wjjh5且不是电商h5不作处理
            }
        }
        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)
        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: - WKUIDelegate
    func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
        if prompt.contains("video://vod"){
            //视频单集
            let tempDic = NSString.getURLParameters(prompt)
            if let dic = tempDic{
                if let contentId = dic.object(forKey: "contentId") as? String{
                    CNLiveDownSlideTool.pushVodController(contentId: contentId, navigationVC: navigationViewController(), isAblumVideo: false)
                }
            }
        }else if prompt.contains("video://album"){
            //视频专辑
            let tempDic = NSString.getURLParameters(prompt)
            if let dic = tempDic{
                if let aidStr = dic.object(forKey: "aid") as? String{
                    //跳转点播专辑
                    CNLiveDownSlideTool.pushVodController(contentId: aidStr, navigationVC: navigationViewController(), isAblumVideo: true)
                }
            }
            

        }
        completionHandler("http")
    }

    // 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")
        self.webControllerUpdateNavBlock?(true, webView.title!, false , "")
    }
    // 页面加载失败时调用
    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)
    }
    // 在发送请求之前,决定是否跳转 -> 默认允许
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        print("decidePolicyFornavigationAction")
        
        var urlStr = (navigationAction.request.url?.absoluteString)!
        if (navigationAction.request.url?.absoluteString.contains("/pages/index/index")) == true{
            //ai是否显示自动播放开关
            print("显示")
            self.webControllerUpdateNavSoundBlock?(true)
        }else{
            print("不显示")
            self.webControllerUpdateNavSoundBlock?(false)
        }
        if navigationAction.request.url?.host == WjjH5 {
            self.webControllerUpdateNavBlock?(false, "", true , urlStr)

            urlStr = self.checkURLWithStr(urlStr: urlStr)
            self.currentUrl = urlStr
            if ((self.webControllerUpdateCurrentUrlBlock?("")) != nil){
                self.webControllerUpdateCurrentUrlBlock!(self.currentUrl)
            }
            
        }
        
        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{
            let webVC =  CNWebViewController()
            webVC.url = URL(string: urlStr)
            navigationViewController().pushViewController(webVC, animated: true)
            decisionHandler(.cancel)
            return
        }
        
        decisionHandler(.allow)
    }
}