CNWebView.swift
8.94 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
//
// CNWebView.swift
// metaCode
//
// Created by zx on 2024/2/1.
//
import Foundation
import WebKit
import WebViewJavascriptBridge
import CNLiveShareToolKit
import CommonCrypto
import CNLiveBusinessTools
class CNWebView:UIView,WKNavigationDelegate{
var configuration:WKWebViewConfiguration?
lazy var cnWebView :WKWebView = {
let cnWebView = WKWebView(frame: self.bounds, configuration: self.configuration!)
return cnWebView
}()
var webUrl:URL?//初始URL
var currentUrl:String = ""//当前网页的url
var bridge:WKWebViewJavascriptBridge?
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
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()
}
}
}
}
func configBridge(){
WKWebViewJavascriptBridge.enableLogging()
self.bridge = WKWebViewJavascriptBridge(for: self.cnWebView)
self.bridge?.setWebViewDelegate(self)
}
//h5拉起原生分享 js call oc
func configBridgeRegister() -> Void {
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{
}
}
})
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
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: - 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{
let webVC = CNWebViewController()
webVC.url = URL(string: urlStr)
navigationViewController().pushViewController(webVC, animated: true)
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
}