fix(ios): fix app crash (#9955)
This commit is contained in:
@@ -13,7 +13,7 @@ enum AffineHttpError: Error {
|
|||||||
|
|
||||||
class AffineHttpHandler: NSObject, WKURLSchemeHandler {
|
class AffineHttpHandler: NSObject, WKURLSchemeHandler {
|
||||||
func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) {
|
func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) {
|
||||||
urlSchemeTask.stopped = Mutex.init(false)
|
urlSchemeTask.stopped = false
|
||||||
guard let rawUrl = urlSchemeTask.request.url else {
|
guard let rawUrl = urlSchemeTask.request.url else {
|
||||||
urlSchemeTask.didFailWithError(AffineHttpError.invalidOperation(reason: "bad request"))
|
urlSchemeTask.didFailWithError(AffineHttpError.invalidOperation(reason: "bad request"))
|
||||||
return
|
return
|
||||||
@@ -55,8 +55,8 @@ class AffineHttpHandler: NSObject, WKURLSchemeHandler {
|
|||||||
|
|
||||||
let task = URLSession.shared.dataTask(with: request) {
|
let task = URLSession.shared.dataTask(with: request) {
|
||||||
(rawData, rawResponse, error) in
|
(rawData, rawResponse, error) in
|
||||||
urlSchemeTask.stopped?.withLock({
|
DispatchQueue.main.async {
|
||||||
if $0 {
|
if urlSchemeTask.stopped {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ class AffineHttpHandler: NSObject, WKURLSchemeHandler {
|
|||||||
}
|
}
|
||||||
urlSchemeTask.didFinish()
|
urlSchemeTask.didFinish()
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
task.resume()
|
task.resume()
|
||||||
|
|
||||||
@@ -97,20 +97,18 @@ class AffineHttpHandler: NSObject, WKURLSchemeHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
|
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
|
||||||
urlSchemeTask.stopped?.withLock({
|
urlSchemeTask.stopped = true
|
||||||
$0 = true
|
|
||||||
})
|
|
||||||
urlSchemeTask.dataTask?.cancel()
|
urlSchemeTask.dataTask?.cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private extension WKURLSchemeTask {
|
private extension WKURLSchemeTask {
|
||||||
var stopped: Mutex<Bool>? {
|
var stopped: Bool {
|
||||||
get {
|
get {
|
||||||
return objc_getAssociatedObject(self, &stoppedKey) as? Mutex<Bool> ?? nil
|
return objc_getAssociatedObject(self, &stoppedKey) as? Bool ?? false
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
|
objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_ASSIGN)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var dataTask: URLSessionDataTask? {
|
var dataTask: URLSessionDataTask? {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ enum AffineWsError: Error {
|
|||||||
class AffineWsHandler: NSObject, WKURLSchemeHandler {
|
class AffineWsHandler: NSObject, WKURLSchemeHandler {
|
||||||
var wsTasks: [UUID: URLSessionWebSocketTask] = [:]
|
var wsTasks: [UUID: URLSessionWebSocketTask] = [:]
|
||||||
func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) {
|
func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) {
|
||||||
urlSchemeTask.stopped = Mutex.init(false)
|
urlSchemeTask.stopped = false
|
||||||
guard let rawUrl = urlSchemeTask.request.url else {
|
guard let rawUrl = urlSchemeTask.request.url else {
|
||||||
urlSchemeTask.didFailWithError(AffineWsError.invalidOperation(reason: "bad request"))
|
urlSchemeTask.didFailWithError(AffineWsError.invalidOperation(reason: "bad request"))
|
||||||
return
|
return
|
||||||
@@ -79,9 +79,8 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler {
|
|||||||
var completionHandler: ((Result<URLSessionWebSocketTask.Message, any Error>) -> Void)!
|
var completionHandler: ((Result<URLSessionWebSocketTask.Message, any Error>) -> Void)!
|
||||||
completionHandler = {
|
completionHandler = {
|
||||||
let result = $0
|
let result = $0
|
||||||
urlSchemeTask.stopped?.withLock({
|
DispatchQueue.main.async {
|
||||||
let stopped = $0
|
if urlSchemeTask.stopped {
|
||||||
if stopped {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let jsonEncoder = JSONEncoder()
|
let jsonEncoder = JSONEncoder()
|
||||||
@@ -96,7 +95,7 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler {
|
|||||||
urlSchemeTask.didReceive("data: \(json)\n\n".data(using: .utf8)!)
|
urlSchemeTask.didReceive("data: \(json)\n\n".data(using: .utf8)!)
|
||||||
urlSchemeTask.didFinish()
|
urlSchemeTask.didFinish()
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
// recursive calls
|
// recursive calls
|
||||||
webSocketTask.receive(completionHandler: completionHandler)
|
webSocketTask.receive(completionHandler: completionHandler)
|
||||||
@@ -148,8 +147,8 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler {
|
|||||||
|
|
||||||
webSocketTask.send(.string(stringBody), completionHandler: {
|
webSocketTask.send(.string(stringBody), completionHandler: {
|
||||||
error in
|
error in
|
||||||
urlSchemeTask.stopped?.withLock({
|
DispatchQueue.main.async {
|
||||||
if $0 {
|
if urlSchemeTask.stopped {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if error != nil {
|
if error != nil {
|
||||||
@@ -161,26 +160,24 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler {
|
|||||||
urlSchemeTask.didReceive(try! jsonEncoder.encode(["uuid": uuid.uuidString.data(using: .utf8)!]))
|
urlSchemeTask.didReceive(try! jsonEncoder.encode(["uuid": uuid.uuidString.data(using: .utf8)!]))
|
||||||
urlSchemeTask.didFinish()
|
urlSchemeTask.didFinish()
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
|
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
|
||||||
urlSchemeTask.stopped?.withLock({
|
urlSchemeTask.stopped = true
|
||||||
$0 = true
|
|
||||||
})
|
|
||||||
urlSchemeTask.wsTask?.cancel(with: .abnormalClosure, reason: "Closed".data(using: .utf8))
|
urlSchemeTask.wsTask?.cancel(with: .abnormalClosure, reason: "Closed".data(using: .utf8))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private extension WKURLSchemeTask {
|
private extension WKURLSchemeTask {
|
||||||
var stopped: Mutex<Bool>? {
|
var stopped: Bool {
|
||||||
get {
|
get {
|
||||||
return objc_getAssociatedObject(self, &stoppedKey) as? Mutex<Bool> ?? nil
|
return objc_getAssociatedObject(self, &stoppedKey) as? Bool ?? false
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
|
objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_ASSIGN)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var wsTask: URLSessionWebSocketTask? {
|
var wsTask: URLSessionWebSocketTask? {
|
||||||
|
|||||||
Reference in New Issue
Block a user