From 0d0069f0535d71b9adba364c3349cdc56d60479a Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 21 Jun 2023 08:21:58 +0200 Subject: [PATCH 1/3] add webview refresh handler --- Sources/Web3Inbox/Web3InboxClient.swift | 7 ++++-- .../Web3Inbox/Web3InboxClientFactory.swift | 5 +++- Sources/Web3Inbox/WebView/WebViewProxy.swift | 25 +++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Sources/Web3Inbox/Web3InboxClient.swift b/Sources/Web3Inbox/Web3InboxClient.swift index 730180633..76aa2bce9 100644 --- a/Sources/Web3Inbox/Web3InboxClient.swift +++ b/Sources/Web3Inbox/Web3InboxClient.swift @@ -16,6 +16,8 @@ public final class Web3InboxClient { private let chatWebviewProxy: WebViewProxy private let pushWebviewProxy: WebViewProxy + private let webViewRefreshHandler: WebViewRefreshHandler + private let chatWebviewSubscriber: WebViewRequestSubscriber private let pushWebviewSubscriber: WebViewRequestSubscriber @@ -30,7 +32,8 @@ init( chatWebviewSubscriber: WebViewRequestSubscriber, pushWebviewSubscriber: WebViewRequestSubscriber, pushClientProxy: PushClientProxy, - pushClientSubscriber: PushClientRequestSubscriber + pushClientSubscriber: PushClientRequestSubscriber, + webViewRefreshHandler: WebViewRefreshHandler ) { self.webView = webView self.account = account @@ -43,7 +46,7 @@ init( self.pushWebviewSubscriber = pushWebviewSubscriber self.pushClientProxy = pushClientProxy self.pushClientSubscriber = pushClientSubscriber - + self.webViewRefreshHandler = webViewRefreshHandler setupSubscriptions() } diff --git a/Sources/Web3Inbox/Web3InboxClientFactory.swift b/Sources/Web3Inbox/Web3InboxClientFactory.swift index 50d255e29..a87c4c0fb 100644 --- a/Sources/Web3Inbox/Web3InboxClientFactory.swift +++ b/Sources/Web3Inbox/Web3InboxClientFactory.swift @@ -24,6 +24,8 @@ final class Web3InboxClientFactory { let pushClientProxy = PushClientProxy(client: pushClient, onSign: onSign) let pushClientSubscriber = PushClientRequestSubscriber(client: pushClient, logger: logger) + let webViewRefreshHandler = WebViewRefreshHandler(webView: webView, initUrl: url) + return Web3InboxClient( webView: webView, account: account, @@ -35,7 +37,8 @@ final class Web3InboxClientFactory { chatWebviewSubscriber: chatWebviewSubscriber, pushWebviewSubscriber: pushWebviewSubscriber, pushClientProxy: pushClientProxy, - pushClientSubscriber: pushClientSubscriber + pushClientSubscriber: pushClientSubscriber, + webViewRefreshHandler: webViewRefreshHandler ) } diff --git a/Sources/Web3Inbox/WebView/WebViewProxy.swift b/Sources/Web3Inbox/WebView/WebViewProxy.swift index b0a4451f0..e778850a6 100644 --- a/Sources/Web3Inbox/WebView/WebViewProxy.swift +++ b/Sources/Web3Inbox/WebView/WebViewProxy.swift @@ -1,6 +1,30 @@ import Foundation import WebKit +class WebViewRefreshHandler { + var webViewURLObserver: NSKeyValueObservation! + let webView: WKWebView + let initUrl: URL + + init(webView: WKWebView, initUrl: URL) { + self.webView = webView + self.initUrl = initUrl +// let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in +// print("Timer fired!") +// webView.reload() +// } + self.webViewURLObserver = webView.observe(\.url, options: .new) { webview, change in + print("URL: \(String(describing: change.newValue))") + if let newValue = change.newValue, + let url = newValue?.absoluteString, + url.contains("/login") { + let request = URLRequest(url: initUrl) + webview.load(request) + } + } + } +} + actor WebViewProxy { private let webView: WKWebView @@ -13,6 +37,7 @@ actor WebViewProxy { self.webView = webView self.scriptFormatter = scriptFormatter self.logger = logger + } @MainActor From 410e6d047d97d6fe5c1765a41175d037fe1a2c1b Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 21 Jun 2023 10:07:32 +0200 Subject: [PATCH 2/3] extract the class --- .../Web3Inbox/Web3InboxClientFactory.swift | 4 +- Sources/Web3Inbox/WebView/WebViewProxy.swift | 24 ------------ .../WebView/WebViewRefreshHandler.swift | 37 +++++++++++++++++++ 3 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift diff --git a/Sources/Web3Inbox/Web3InboxClientFactory.swift b/Sources/Web3Inbox/Web3InboxClientFactory.swift index a87c4c0fb..8d01cb0e2 100644 --- a/Sources/Web3Inbox/Web3InboxClientFactory.swift +++ b/Sources/Web3Inbox/Web3InboxClientFactory.swift @@ -24,7 +24,7 @@ final class Web3InboxClientFactory { let pushClientProxy = PushClientProxy(client: pushClient, onSign: onSign) let pushClientSubscriber = PushClientRequestSubscriber(client: pushClient, logger: logger) - let webViewRefreshHandler = WebViewRefreshHandler(webView: webView, initUrl: url) + let webViewRefreshHandler = WebViewRefreshHandler(webView: webView, initUrl: url, logger: logger) return Web3InboxClient( webView: webView, @@ -44,7 +44,7 @@ final class Web3InboxClientFactory { private static func buildUrl(account: Account, config: [ConfigParam: Bool]) -> URL { var urlComponents = URLComponents(string: "https://web3inbox-dev-hidden.vercel.app/")! - var queryItems = [URLQueryItem(name: "chatProvider", value: "ios"), URLQueryItem(name: "pushProvider", value: "ios"), URLQueryItem(name: "account", value: account.address)] + var queryItems = [URLQueryItem(name: "chatProvider", value: "ios"), URLQueryItem(name: "pushProvider", value: "ios"), URLQueryItem(name: "account", value: account.address), URLQueryItem(name: "authProvider", value: "ios")] for param in config.filter({ $0.value == false}) { queryItems.append(URLQueryItem(name: "\(param.key)", value: "false")) diff --git a/Sources/Web3Inbox/WebView/WebViewProxy.swift b/Sources/Web3Inbox/WebView/WebViewProxy.swift index e778850a6..af3d0d8d7 100644 --- a/Sources/Web3Inbox/WebView/WebViewProxy.swift +++ b/Sources/Web3Inbox/WebView/WebViewProxy.swift @@ -1,30 +1,6 @@ import Foundation import WebKit -class WebViewRefreshHandler { - var webViewURLObserver: NSKeyValueObservation! - let webView: WKWebView - let initUrl: URL - - init(webView: WKWebView, initUrl: URL) { - self.webView = webView - self.initUrl = initUrl -// let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in -// print("Timer fired!") -// webView.reload() -// } - self.webViewURLObserver = webView.observe(\.url, options: .new) { webview, change in - print("URL: \(String(describing: change.newValue))") - if let newValue = change.newValue, - let url = newValue?.absoluteString, - url.contains("/login") { - let request = URLRequest(url: initUrl) - webview.load(request) - } - } - } -} - actor WebViewProxy { private let webView: WKWebView diff --git a/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift b/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift new file mode 100644 index 000000000..fff93d4c8 --- /dev/null +++ b/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift @@ -0,0 +1,37 @@ +import WebKit +import Foundation + +class WebViewRefreshHandler { + private var webViewURLObserver: NSKeyValueObservation! + private let webView: WKWebView + private let initUrl: URL + private var isReloadingContent = false + private let logger: ConsoleLogging + + init(webView: WKWebView, + initUrl: URL, + logger: ConsoleLogging) { + self.webView = webView + self.initUrl = initUrl + self.logger = logger + setUpWebViewObserver() + } + + func setUpWebViewObserver() { + self.webViewURLObserver = webView.observe(\.url, options: .new) { [unowned self] webview, change in + logger.debug("URL: \(String(describing: change.newValue))") + if let newValue = change.newValue, + let url = newValue?.absoluteString, + url.contains("/login"), + !isReloadingContent { + isReloadingContent = true + let request = URLRequest(url: initUrl) + + webview.load(request) + _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { [unowned self] timer in + isReloadingContent = false + } + } + } + } +} From 549c599b33a956548e0ec09c58d520d63e1b8ce5 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 21 Jun 2023 12:50:50 +0200 Subject: [PATCH 3/3] change interval --- Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift b/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift index fff93d4c8..c6155d9f9 100644 --- a/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift +++ b/Sources/Web3Inbox/WebView/WebViewRefreshHandler.swift @@ -28,7 +28,7 @@ class WebViewRefreshHandler { let request = URLRequest(url: initUrl) webview.load(request) - _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { [unowned self] timer in + _ = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { [unowned self] timer in isReloadingContent = false } }