Commit 5ca9e19b6127c06db600d55ea8e542955a5a1edc

Authored by “张旭”
1 parent 1be46733

网页加交互, ...分享 , 网页返回上一步

@@ -67,6 +67,7 @@ target 'metaCode' do @@ -67,6 +67,7 @@ target 'metaCode' do
67 # pod 'QMUIKit' 67 # pod 'QMUIKit'
68 pod 'YYWebImage', :git => 'https://gitee.com/mirrors/YYWebImage.git' 68 pod 'YYWebImage', :git => 'https://gitee.com/mirrors/YYWebImage.git'
69 69
  70 + #网页交互
70 pod 'WebViewJavascriptBridge' 71 pod 'WebViewJavascriptBridge'
71 72
72 #依赖三方私有库,如果里面有.a的时候加上这个 73 #依赖三方私有库,如果里面有.a的时候加上这个
metaCode/Classes/Common/Base/CNLiveBaseViewController.swift
@@ -108,7 +108,9 @@ class CNLiveBaseViewController: UIViewController { @@ -108,7 +108,9 @@ class CNLiveBaseViewController: UIViewController {
108 btn.frame = CGRect(x: lastBtn != nil ? (lastBtn!.origin.x - btn.width) : (topNavView.width - CNLiveBaseViewController.kTopNavLeftRightOffset - btn.width), y: topNavViewHeight - btn.height, width: btn.width, height: btn.height) 108 btn.frame = CGRect(x: lastBtn != nil ? (lastBtn!.origin.x - btn.width) : (topNavView.width - CNLiveBaseViewController.kTopNavLeftRightOffset - btn.width), y: topNavViewHeight - btn.height, width: btn.width, height: btn.height)
109 lastBtn = btn 109 lastBtn = btn
110 } 110 }
111 - rightNavSpace = CGRectGetMaxX(lastBtn!.frame) 111 + if _rightNavBtns.count > 0{
  112 + rightNavSpace = CGRectGetMaxX(lastBtn!.frame)
  113 + }
112 viewWillLayoutSubviews() 114 viewWillLayoutSubviews()
113 } 115 }
114 } 116 }
metaCode/Classes/Main/HomePage/Controller/WebController/CNWebViewController.swift
@@ -7,17 +7,41 @@ @@ -7,17 +7,41 @@
7 7
8 import Foundation 8 import Foundation
9 import WebKit 9 import WebKit
  10 +import WebViewJavascriptBridge
  11 +import CNLiveShareToolKit
10 12
11 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ 13 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
12 14
  15 + var bridge:WKWebViewJavascriptBridge?
  16 + var currentUrl:String = ""//当前网页的url
  17 +
13 lazy var webView: WKWebView = { 18 lazy var webView: WKWebView = {
14 - let webView = WKWebView.init(frame: CGRectMake(0, 0, Width, Height)) 19 + let configuration = WKWebViewConfiguration()
  20 + configuration.allowsInlineMediaPlayback = true
  21 + let preferences = WKPreferences()
  22 + preferences.javaScriptCanOpenWindowsAutomatically = true
  23 + preferences.javaScriptEnabled = true
  24 + configuration.preferences.minimumFontSize = 0.0
  25 + configuration.preferences = preferences
  26 + configuration.userContentController = WKUserContentController()
  27 +
  28 + let webView = WKWebView(frame: CGRectMake(0, 0, Width, Height), configuration: configuration)
15 webView.scrollView.showsVerticalScrollIndicator = false 29 webView.scrollView.showsVerticalScrollIndicator = false
16 webView.scrollView.showsHorizontalScrollIndicator = false 30 webView.scrollView.showsHorizontalScrollIndicator = false
17 - webView.navigationDelegate = self 31 +// webView.navigationDelegate = self
18 return webView 32 return webView
19 }() 33 }()
20 34
  35 + lazy var moreNavBtn: UIButton = {
  36 + let moreNavBtn = UIButton(type: .custom)
  37 + moreNavBtn.frame = CGRect(x: 0, y: KStatusBarHeight, width: KNavigationHeight-KStatusBarHeight, height: KNavigationHeight-KStatusBarHeight)
  38 + moreNavBtn.backgroundColor = .clear
  39 + moreNavBtn.setImage(UIImage(named: "web_more"), for: .normal)
  40 + moreNavBtn.addTarget(self, action: #selector(moreNavBtnAction), for: .touchUpInside)
  41 + return moreNavBtn
  42 + }()
  43 +
  44 +
21 var _url:URL? 45 var _url:URL?
22 var url:URL? { 46 var url:URL? {
23 get{ 47 get{
@@ -26,17 +50,18 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -26,17 +50,18 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
26 set{ 50 set{
27 _url = newValue! 51 _url = newValue!
28 if (_url != nil){ 52 if (_url != nil){
29 - let webUrl: URL! = _url!  
30 - webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in  
31 - let userAgent = result as! String  
32 - if error == nil && userAgent.count > 0 {  
33 - if !userAgent.contains(CNLiveEnvironmentManager.shared.base_web_UA) {  
34 - let newUserAgent = userAgent + CNLiveEnvironmentManager.shared.base_web_UA  
35 - webView.customUserAgent = newUserAgent  
36 - }  
37 - }  
38 - webView.load(URLRequest.init(url:webUrl))  
39 - } 53 +// let webUrl: URL! = _url!
  54 +// webView.load(URLRequest.init(url:webUrl))
  55 +// webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in
  56 +// let userAgent = result as! String
  57 +// if error == nil && userAgent.count > 0 {
  58 +// if !userAgent.contains(CNLiveEnvironmentManager.shared.base_web_UA) {
  59 +// let newUserAgent = userAgent + CNLiveEnvironmentManager.shared.base_web_UA
  60 +// webView.customUserAgent = newUserAgent
  61 +// }
  62 +// }
  63 +// webView.load(URLRequest.init(url:webUrl))
  64 +// }
40 } 65 }
41 } 66 }
42 } 67 }
@@ -49,7 +74,87 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -49,7 +74,87 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
49 make.top.equalTo(get_system_nav_height()) 74 make.top.equalTo(get_system_nav_height())
50 make.left.right.bottom.equalToSuperview() 75 make.left.right.bottom.equalToSuperview()
51 } 76 }
52 - 77 + webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in
  78 + let userAgent = result as! String
  79 + if error == nil && userAgent.count > 0 {
  80 + if !userAgent.contains(CNLiveEnvironmentManager.shared.base_web_UA) {
  81 + let newUserAgent = userAgent + CNLiveEnvironmentManager.shared.base_web_UA
  82 + webView.customUserAgent = newUserAgent
  83 +
  84 + if (_url != nil){
  85 + let webUrl: URL! = _url!
  86 + webView.load(URLRequest.init(url:webUrl))
  87 + }
  88 + self.configBridge()
  89 + self.configBridgeRegister()
  90 + }
  91 + }
  92 + }
  93 + }
  94 +
  95 + func configBridge(){
  96 + WKWebViewJavascriptBridge.enableLogging()
  97 + self.bridge = WKWebViewJavascriptBridge(for: self.webView)
  98 + self.bridge?.setWebViewDelegate(self)
  99 + }
  100 + //h5拉起原生分享 js call oc
  101 + func configBridgeRegister() -> Void {
  102 + self.bridge?.registerHandler("wjjylzgVideoShare", handler: { data, responseCallback in
  103 +// print("js call oc\(data)")
  104 + let dic = data as! Dictionary<String, String>
  105 + 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
  106 +
  107 + } completerBlock: { resultType, platformType, typeString in
  108 + if resultType == .succ{
  109 +
  110 + }
  111 + }
  112 +
  113 + })
  114 + }
  115 +
  116 + //点击...分享获取h5参数oc call js
  117 + func configBridgeCallHander() -> Void {
  118 + self.bridge?.callHandler("wjjClientGetShareParaFromJS", data: ["":""], responseCallback: { data in
  119 + print("js call oc\(data)")
  120 + let dic = data as! Dictionary<String, String>
  121 +// let shareType = dic["shareType"]
  122 +// let contentIdStr = dic["activityId"]
  123 + let title = dic["title"]
  124 + let desc = dic["desc"]
  125 + let shareImg = dic["shareImg"]
  126 +
  127 + var shareUrl = ""
  128 + if var tempShareUrl = dic["shareUrl"]{
  129 + if tempShareUrl == ""{
  130 + shareUrl = self.currentUrl
  131 + }else{
  132 + shareUrl = tempShareUrl
  133 + }
  134 + }else{
  135 + shareUrl = self.currentUrl
  136 + }
  137 +
  138 + 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
  139 +
  140 + } completerBlock: { resultType, platformType, typeString in
  141 + if resultType == .succ{
  142 +
  143 + }
  144 + }
  145 + })
  146 + }
  147 + // MARK: - BtnAction
  148 + // 内部链接右上角···分享
  149 + @objc func moreNavBtnAction(){
  150 + self.configBridgeCallHander()
  151 + }
  152 + override func ClickBackBtn() {
  153 + if self.webView.canGoBack{
  154 + self.webView.goBack()
  155 + }else{
  156 + super.ClickBackBtn()
  157 + }
53 } 158 }
54 159
55 // MARK: - WKWebViewDelegate 160 // MARK: - WKWebViewDelegate
@@ -61,6 +166,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -61,6 +166,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
61 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { 166 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
62 print("didCommit") 167 print("didCommit")
63 } 168 }
  169 +
64 // 页面加载完成之后调用 170 // 页面加载完成之后调用
65 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 171 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
66 print("didFinish") 172 print("didFinish")
@@ -76,15 +182,31 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -76,15 +182,31 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
76 } 182 }
77 // 在收到响应后,决定是否跳转 -> 默认允许 183 // 在收到响应后,决定是否跳转 -> 默认允许
78 func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { 184 func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
79 - print("decidePolicyFor") 185 +
  186 + print("decidePolicyFornavigationResponse")
  187 +
80 //允许跳转 188 //允许跳转
81 decisionHandler(.allow) 189 decisionHandler(.allow)
82 //不允许跳转 190 //不允许跳转
83 // decisionHandler(.cancel) 191 // decisionHandler(.cancel)
84 } 192 }
85 // 在发送请求之前,决定是否跳转 -> 默认允许 193 // 在发送请求之前,决定是否跳转 -> 默认允许
86 - @available(iOS 13.0, *)  
87 - func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) { 194 + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  195 + print("decidePolicyFornavigationAction")
  196 +
  197 + let urlStr = (navigationAction.request.url?.absoluteString)!
  198 +
  199 + if navigationAction.request.url?.host == "wjjh5.cnlive.com"{
  200 + self.currentUrl = urlStr
  201 +
  202 + if urlStr.contains("&isWjjReport=true") || urlStr.contains("?isWjjReport=true"){
  203 + self.rightNavBtns = [self.moreNavBtn]
  204 + self.moreNavBtn.isHidden = false
  205 + }else{
  206 + self.moreNavBtn.isHidden = true
  207 + }
  208 + }
  209 +
88 210
89 if navigationAction.navigationType == .other{ 211 if navigationAction.navigationType == .other{
90 //跳转Appstore 212 //跳转Appstore
@@ -93,7 +215,10 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -93,7 +215,10 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
93 if UIApplication.shared.canOpenURL(url!) { UIApplication.shared.open(url!, options: [:], completionHandler: nil) 215 if UIApplication.shared.canOpenURL(url!) { UIApplication.shared.open(url!, options: [:], completionHandler: nil)
94 } 216 }
95 } 217 }
  218 + }else if navigationAction.navigationType == .linkActivated{
  219 +
  220 +
96 } 221 }
97 - decisionHandler(.allow, preferences) 222 + decisionHandler(.allow)
98 } 223 }
99 } 224 }
metaCode/Supporting Files/Assets.xcassets/WebView/Contents.json 0 → 100644
  1 +{
  2 + "info" : {
  3 + "author" : "xcode",
  4 + "version" : 1
  5 + }
  6 +}
metaCode/Supporting Files/Assets.xcassets/WebView/web_more.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "web_more@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "filename" : "web_more@3x.png",
  14 + "idiom" : "universal",
  15 + "scale" : "3x"
  16 + }
  17 + ],
  18 + "info" : {
  19 + "author" : "xcode",
  20 + "version" : 1
  21 + }
  22 +}
metaCode/Supporting Files/Assets.xcassets/WebView/web_more.imageset/web_more@2x.png 0 → 100644

450 Bytes

metaCode/Supporting Files/Assets.xcassets/WebView/web_more.imageset/web_more@3x.png 0 → 100644

931 Bytes