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