У меня проблемы с возвратом currentURL и previousURL из пользовательского WebView. То, что я хочу сделать, это отобразить webView и вернуть 2 переменные URL при загрузке сети.
Пока я могу отображать только предоставленный URL. Так что есть идеи, как я могу вернуть currentURL и previousURL из UIViewRepresentable?
Вот мой пользовательский вид
struct CustomWebView: View {
@Environment(\.presentationMode) var presentationMode
var url: String
var encode = true
var auth: Bool
@State var isLoading = true
var body: some View {
ZStack {
ResresentableWebView(url: url, encode: encode, auth: auth, isLoading: $isLoading)
ActivityIndicator(isAnimating: $isLoading, color: #colorLiteral(red: 0, green: 0.8274509804, blue: 0.7843137255, alpha: 1) , style: .large)
}.modifier(NoBar())
}
}
struct ResresentableWebView: UIViewRepresentable {
var url: String
var encode: Bool
var auth: Bool
var currentUrl: String
var previuousUrl: String
@ObservedObject var observe = observable()
@Binding var isLoading: Bool
func makeUIView(context: UIViewRepresentableContext<ResresentableWebView>) -> WKWebView {
var strUrl = self.url
if auth {
if UserData.shared.accessToken != "" && UserData.shared.refreshToken != "" {
strUrl += "&accessToken=\(UserData.shared.accessToken)&refreshToken=\(UserData.shared.refreshToken)"
}
}
guard let encodedUrl = strUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return WKWebView()}
debugPrint("Encoded Url", encodedUrl)
guard let url = URL(string: encode ? encodedUrl: self.url) else {
return WKWebView()
}
let request = URLRequest(url: url)
let webView = WKWebView()
webView.navigationDelegate = context.coordinator
webView.load(request)
return webView
}
func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<ResresentableWebView>) {
observe.observation = uiView.observe(\WKWebView.url, options: .new) { view, change in
if let title = view.url {
self.observe.loggedIn = true
debugPrint("Page loaded: \(title)")
view.evaluateJavaScript(jsScript) { (_, _) in }
}
}
}
func makeCoordinator() -> Coordinator {
debugPrint("Making Coordinator")
return Coordinator(self)
}
class Coordinator : NSObject, WKNavigationDelegate {
var webview: ResresentableWebView
init(_ webview: ResresentableWebView) {
self.webview = webview
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.alpha = 0
DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) {
webView.evaluateJavaScript(jsScript) { (_, _) in }
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.webview.isLoading = false
webView.alpha = 1
}
}
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
self.webview.isLoading = true
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
self.webview.isLoading = false
}
}
}
class ObservableVariable: ObservableObject {
@Published var observation:NSKeyValueObservation?
@Published var loggedIn = false
}