fix(ios): fix app crash (#9955)

This commit is contained in:
EYHN
2025-02-05 09:44:54 +00:00
parent c8790d20da
commit 5913715e33
2 changed files with 19 additions and 24 deletions

View File

@@ -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? {

View File

@@ -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? {