Commit bc4912d58688d86cbaae9dac65a9c4f6b7855260

Authored by “张旭”
1 parent b5e11e8f

webView交互 , 分享...

metaCode/Classes/Extensions/String+Extension.swift
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 7
8 8
9 import UIKit 9 import UIKit
10 - 10 +import CommonCrypto
11 11
12 extension String { 12 extension String {
13 /// Calculate text's height from `width` and `front`. 13 /// Calculate text's height from `width` and `front`.
@@ -25,5 +25,63 @@ extension String { @@ -25,5 +25,63 @@ extension String {
25 let substring = self[startIndex..<endIndex] 25 let substring = self[startIndex..<endIndex]
26 return String(substring) 26 return String(substring)
27 } 27 }
  28 +
  29 + //加密
  30 + func crypt(operation:CCOperation, key: String) -> String? {
  31 +
  32 + if let keyData = key.data(using: .utf8) {
  33 +
  34 + var cryptData: Data?
  35 +
  36 + if operation == kCCEncrypt {
  37 + cryptData = self.data(using: .utf8)
  38 + } else {
  39 + cryptData = Data(base64Encoded: self, options: .ignoreUnknownCharacters)
  40 + }
  41 +
  42 + if cryptData == nil {
  43 + return nil
  44 + }
  45 +
  46 + let algoritm: CCAlgorithm = CCAlgorithm(kCCAlgorithmDES)
  47 + let option: CCOptions = CCOptions(kCCOptionPKCS7Padding)
  48 +
  49 + let keyBytes = [UInt8](keyData)
  50 + let keyLength = kCCKeySizeDES
  51 +
  52 + let dataIn = [UInt8](cryptData!)
  53 + let dataInlength = cryptData!.count
  54 +
  55 + let dataOutAvailable = Int(dataInlength + kCCBlockSizeDES)
  56 + let dataOut = UnsafeMutablePointer<UInt8>.allocate(capacity: dataOutAvailable)
  57 + let dataOutMoved = UnsafeMutablePointer<Int>.allocate(capacity: 1)
  58 +
  59 + dataOutMoved.initialize(to: 0)
  60 +
  61 + let cryptStatus = CCCrypt(operation, algoritm, option, keyBytes, keyLength, keyBytes, dataIn, dataInlength, dataOut, dataOutAvailable, dataOutMoved)
  62 +
  63 + var data: Data?
  64 +
  65 + if CCStatus(cryptStatus) == CCStatus(kCCSuccess) {
  66 + data = Data(bytesNoCopy: dataOut, count: dataOutMoved.pointee, deallocator: .none)
  67 + }
  68 +
  69 + dataOutMoved.deallocate()
  70 + dataOut.deallocate()
  71 +
  72 + if data == nil {
  73 + return nil
  74 + }
  75 +
  76 + if operation == kCCEncrypt {
  77 + data = data!.base64EncodedData(options: .lineLength64Characters)
  78 + }
  79 +
  80 + return String(data: data!, encoding: .utf8)
  81 + }
  82 +
  83 + return nil
  84 +
  85 + }
28 86
29 } 87 }
metaCode/Classes/Main/HomePage/Controller/WebController/CNWebViewController.swift
@@ -9,6 +9,11 @@ import Foundation @@ -9,6 +9,11 @@ import Foundation
9 import WebKit 9 import WebKit
10 import WebViewJavascriptBridge 10 import WebViewJavascriptBridge
11 import CNLiveShareToolKit 11 import CNLiveShareToolKit
  12 +import CommonCrypto
  13 +import CNLiveBusinessTools
  14 +
  15 +
  16 +let WjjH5 = "wjjh5.cnlive.com"
12 17
13 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ 18 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
14 19
@@ -63,13 +68,15 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -63,13 +68,15 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
63 webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in 68 webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in
64 let userAgent = result as! String 69 let userAgent = result as! String
65 if error == nil && userAgent.count > 0 { 70 if error == nil && userAgent.count > 0 {
66 - if !userAgent.contains(CNLiveEnvironmentManager.shared.base_web_UA) {  
67 - let newUserAgent = userAgent + CNLiveEnvironmentManager.shared.base_web_UA 71 + if !userAgent.contains(CNLiveMCEnvironmentManager.shared.base_web_UA) {
  72 + let newUserAgent = userAgent + CNLiveMCEnvironmentManager.shared.base_web_UA
68 webView.customUserAgent = newUserAgent 73 webView.customUserAgent = newUserAgent
69 74
70 if (_url != nil){ 75 if (_url != nil){
71 - let webUrl: URL! = _url!  
72 - webView.load(URLRequest.init(url:webUrl)) 76 + let urlStr = self.checkURLWithStr(urlStr: _url!.absoluteString)
  77 + self.currentUrl = urlStr
  78 +
  79 + webView.load(URLRequest.init(url:URL(string: urlStr)!))
73 } 80 }
74 self.configBridge() 81 self.configBridge()
75 self.configBridgeRegister() 82 self.configBridgeRegister()
@@ -102,7 +109,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -102,7 +109,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
102 //点击...分享获取h5参数oc call js 109 //点击...分享获取h5参数oc call js
103 func configBridgeCallHander() -> Void { 110 func configBridgeCallHander() -> Void {
104 self.bridge?.callHandler("wjjClientGetShareParaFromJS", data: ["":""], responseCallback: { data in 111 self.bridge?.callHandler("wjjClientGetShareParaFromJS", data: ["":""], responseCallback: { data in
105 - print("js call oc\(data)") 112 +// print("js call oc\(data)")
106 let dic = data as! Dictionary<String, String> 113 let dic = data as! Dictionary<String, String>
107 // let shareType = dic["shareType"] 114 // let shareType = dic["shareType"]
108 // let contentIdStr = dic["activityId"] 115 // let contentIdStr = dic["activityId"]
@@ -111,7 +118,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -111,7 +118,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
111 let shareImg = dic["shareImg"] 118 let shareImg = dic["shareImg"]
112 119
113 var shareUrl = "" 120 var shareUrl = ""
114 - if var tempShareUrl = dic["shareUrl"]{ 121 + if let tempShareUrl = dic["shareUrl"]{
115 if tempShareUrl == ""{ 122 if tempShareUrl == ""{
116 shareUrl = self.currentUrl 123 shareUrl = self.currentUrl
117 }else{ 124 }else{
@@ -130,6 +137,61 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -130,6 +137,61 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
130 } 137 }
131 }) 138 })
132 } 139 }
  140 +
  141 + func checkURLWithStr(urlStr:String) -> String{
  142 + if URL(string: urlStr)?.host != WjjH5 {
  143 + return urlStr//不是wjjh5不作处理
  144 + }
  145 + var str = urlStr
  146 + let date = Date()
  147 + let formatter = DateFormatter()
  148 + formatter.dateFormat = "yyyyMMdd"
  149 + let dateStr = formatter.string(from: date)
  150 + let sidStr = String(format: "%@%@", UserInfoManager.shared.userInfo.uid,dateStr)
  151 + let signStr = sidStr.crypt(operation: CCOperation(kCCEncrypt), key: CNLiveMCEnvironmentManager.shared.appKey)
  152 + //看是 appKey还是appKeywjj
  153 + let sidSignStr = (signStr ?? "").isEmpty ? "" : signStr
  154 + let sourceArray = str.components(separatedBy: "?")
  155 + let buildVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
  156 + let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
  157 + let uuid = CNLiveBusinessTools.getUidForStat(Date())
  158 + if sourceArray.count == 1{
  159 + //是wjjh5且无参数
  160 + 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)
  161 + return str
  162 + }
  163 + //是wjjh5且有参数
  164 + let paraArr = NSMutableArray(array: ["shareSid=","sid=","plat=","ver=","version=","wjjFrom=","wjjUUID=","appId=","voteId=","wjjToken="])
  165 + 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])
  166 + var i = 0
  167 + for paraStr in paraArr{
  168 + let tempStr = paraStr as! String
  169 + let paramStr = "&".appending(tempStr)
  170 + let paramStr2 = "?".appending(tempStr)
  171 +
  172 + if str.contains(paramStr){
  173 + //包含则替换 &sid=
  174 + let lastStr = str.components(separatedBy: tempStr).last
  175 + let lastSeparatedStr = (lastStr?.components(separatedBy: "&").first)!
  176 + let oldStr = tempStr.appending(lastSeparatedStr)
  177 + let tempValueStr = tempStr.appending(valueArr[i] as! String)
  178 + str = str.replacingOccurrences(of: oldStr, with: tempValueStr)
  179 + }else if str.contains(paramStr2){
  180 + //包含则替换 &sid=
  181 + let lastStr = str.components(separatedBy: tempStr).last
  182 + let lastSeparatedStr = (lastStr?.components(separatedBy: "&").first)!
  183 + let oldStr = tempStr.appending(lastSeparatedStr)
  184 + let tempValueStr = tempStr.appending(valueArr[i] as! String)
  185 + str = str.replacingOccurrences(of: oldStr, with: tempValueStr)
  186 + }else{
  187 + //不包含则拼接
  188 + str = String(format: "%@&%@%@", str,tempStr,valueArr[i] as! String)
  189 + }
  190 + i = i + 1
  191 + }
  192 + return str
  193 + }
  194 +
133 // MARK: - BtnAction 195 // MARK: - BtnAction
134 // 内部链接右上角···分享 196 // 内部链接右上角···分享
135 @objc func moreNavBtnAction(){ 197 @objc func moreNavBtnAction(){
@@ -146,30 +208,30 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -146,30 +208,30 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
146 // MARK: - WKWebViewDelegate 208 // MARK: - WKWebViewDelegate
147 // 页面开始加载时调用 209 // 页面开始加载时调用
148 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { 210 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
149 - print("didStartProvisionalNavigation") 211 +// print("didStartProvisionalNavigation")
150 } 212 }
151 // 当内容开始返回时调用 213 // 当内容开始返回时调用
152 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { 214 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
153 - print("didCommit") 215 +// print("didCommit")
154 } 216 }
155 217
156 // 页面加载完成之后调用 218 // 页面加载完成之后调用
157 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 219 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
158 - print("didFinish") 220 +// print("didFinish")
159 titleName = webView.title! 221 titleName = webView.title!
160 } 222 }
161 // 页面加载失败时调用 223 // 页面加载失败时调用
162 func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { 224 func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
163 - print("didFailProvisionalNavigation") 225 +// print("didFailProvisionalNavigation")
164 } 226 }
165 // 接收到服务器跳转请求之后调用 227 // 接收到服务器跳转请求之后调用
166 func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) { 228 func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
167 - print("didReceiveServerRedirectForProvisionalNavigation") 229 +// print("didReceiveServerRedirectForProvisionalNavigation")
168 } 230 }
169 // 在收到响应后,决定是否跳转 -> 默认允许 231 // 在收到响应后,决定是否跳转 -> 默认允许
170 func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { 232 func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
171 233
172 - print("decidePolicyFornavigationResponse") 234 +// print("decidePolicyFornavigationResponse")
173 235
174 //允许跳转 236 //允许跳转
175 decisionHandler(.allow) 237 decisionHandler(.allow)
@@ -178,12 +240,11 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -178,12 +240,11 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
178 } 240 }
179 // 在发送请求之前,决定是否跳转 -> 默认允许 241 // 在发送请求之前,决定是否跳转 -> 默认允许
180 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 242 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
181 - print("decidePolicyFornavigationAction") 243 +// print("decidePolicyFornavigationAction")
182 244
183 - let urlStr = (navigationAction.request.url?.absoluteString)! 245 + var urlStr = (navigationAction.request.url?.absoluteString)!
184 246
185 - if navigationAction.request.url?.host == "wjjh5.cnlive.com"{  
186 - self.currentUrl = urlStr 247 + if navigationAction.request.url?.host == WjjH5 {
187 248
188 if urlStr.contains("&isWjjReport=true") || urlStr.contains("?isWjjReport=true"){ 249 if urlStr.contains("&isWjjReport=true") || urlStr.contains("?isWjjReport=true"){
189 self.rightNavBtns = [self.moreNavBtn] 250 self.rightNavBtns = [self.moreNavBtn]
@@ -191,8 +252,10 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -191,8 +252,10 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
191 }else{ 252 }else{
192 self.moreNavBtn.isHidden = true 253 self.moreNavBtn.isHidden = true
193 } 254 }
  255 +
  256 + urlStr = self.checkURLWithStr(urlStr: urlStr)
  257 + self.currentUrl = urlStr
194 } 258 }
195 -  
196 259
197 if navigationAction.navigationType == .other{ 260 if navigationAction.navigationType == .other{
198 //跳转Appstore 261 //跳转Appstore