From 77a0ec828637e760e4e212ebc5a2ce3e7f09fa39 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:49:32 +0000 Subject: [PATCH 1/2] chore: do not use localized description for logger --- xcode/App-Mac/ViewController.swift | 2 +- xcode/App-Shared/ViewController.swift | 6 +++--- xcode/Ext-Safari/Functions.swift | 14 +++++++------- xcode/Shared/Preferences.swift | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/xcode/App-Mac/ViewController.swift b/xcode/App-Mac/ViewController.swift index fc7598ee..e09d909c 100644 --- a/xcode/App-Mac/ViewController.swift +++ b/xcode/App-Mac/ViewController.swift @@ -36,7 +36,7 @@ class ViewController: NSViewController { guard let state = state else { self.enabledText.stringValue = "Safari Extension State Unknown" if let error = error { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } else { logger?.error("\(#function, privacy: .public) - couldn't get safari extension state in containing app") } diff --git a/xcode/App-Shared/ViewController.swift b/xcode/App-Shared/ViewController.swift index db573177..83e0040d 100644 --- a/xcode/App-Shared/ViewController.swift +++ b/xcode/App-Shared/ViewController.swift @@ -149,7 +149,7 @@ class ViewController: PlatformViewController, WKNavigationDelegate, WKScriptMess self.extensionState = state.isEnabled ? .on : .off } catch { self.extensionState = .error - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } if #available(macOS 13, *) { useSettingsInsteadOfPreferences = true @@ -193,7 +193,7 @@ class ViewController: PlatformViewController, WKNavigationDelegate, WKScriptMess do { try await SFSafariApplication.showPreferencesForExtension(withIdentifier: extIdentifier) } catch { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") return (nil, error.localizedDescription) } break @@ -344,7 +344,7 @@ extension ViewController { } else { status = .error if let error = error { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } else { logger?.error("\(#function, privacy: .public) - couldn't get safari extension state in containing app") } diff --git a/xcode/Ext-Safari/Functions.swift b/xcode/Ext-Safari/Functions.swift index 7163c9eb..582aef0b 100644 --- a/xcode/Ext-Safari/Functions.swift +++ b/xcode/Ext-Safari/Functions.swift @@ -220,7 +220,7 @@ func updateManifest(with data: Manifest) -> Bool { try fileContent.write(to: url, atomically: false, encoding: .utf8) return true } catch { - logger?.error("\(#function, privacy: .public) - failed to update manifest: \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - failed to update manifest: \(error, privacy: .public)") return false } } @@ -742,7 +742,7 @@ func getRequiredCode(_ filename: String, _ resources: [String], _ fileType: Stri do { try FileManager.default.removeItem(at: directory) } catch { - logger?.error("\(#function, privacy: .public) - failed to remove directory: \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - failed to remove directory: \(error, privacy: .public)") } } return true @@ -796,11 +796,11 @@ func getRequiredCode(_ filename: String, _ resources: [String], _ fileType: Stri try FileManager.default.removeItem(at: abandonFileUrl) logger?.info("\(#function, privacy: .public) - cleanup abandoned resource: \(unsanitize(abandonFileUrl.lastPathComponent), privacy: .public)") } catch { - logger?.error("\(#function, privacy: .public) - failed to remove abandoned resource: \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - failed to remove abandoned resource: \(error, privacy: .public)") } } } catch { - logger?.error("\(#function, privacy: .public) - failed to cleanup resources: \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - failed to cleanup resources: \(error, privacy: .public)") } return true } @@ -877,7 +877,7 @@ func getRemoteFileContents(_ url: String) -> String? { } } if let error = error { - logger?.error("\(#function, privacy: .public) - task error: \(error.localizedDescription, privacy: .public) (\(url, privacy: .public))") + logger?.error("\(#function, privacy: .public) - task error: \(error, privacy: .public) (\(url, privacy: .public))") } semaphore.signal() } @@ -984,7 +984,7 @@ func checkDefaultDirectories() -> Bool { try FileManager.default.createDirectory(at: url, withIntermediateDirectories: false) } catch { // could not create the save location directory, show error - logger?.error("\(#function, privacy: .public) - failed at (1) - \(url, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - failed at (1) - \(url, privacy: .public) - \(error, privacy: .public)") return false } } @@ -1763,7 +1763,7 @@ func trashFile(_ item: [String: Any]) -> Bool { do { try FileManager.default.trashItem(at: url, resultingItemURL: nil) } catch { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") return false } } diff --git a/xcode/Shared/Preferences.swift b/xcode/Shared/Preferences.swift index d26e10ed..45c5a5fe 100644 --- a/xcode/Shared/Preferences.swift +++ b/xcode/Shared/Preferences.swift @@ -60,7 +60,7 @@ private struct SecurityScopedBookmark { relativeTo: nil ) } catch { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } return nil } @@ -74,7 +74,7 @@ private struct SecurityScopedBookmark { bookmarkDataIsStale: &isStale ) } catch { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } return nil } @@ -202,7 +202,7 @@ private struct SecurityScopedBookmark { do { return try url.bookmarkData(options: .minimalBookmark, includingResourceValuesForKeys: nil, relativeTo: nil) } catch { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } return nil } @@ -211,7 +211,7 @@ private struct SecurityScopedBookmark { do { return try URL(resolvingBookmarkData: data, bookmarkDataIsStale: &isStale) } catch { - logger?.error("\(#function, privacy: .public) - \(error.localizedDescription, privacy: .public)") + logger?.error("\(#function, privacy: .public) - \(error, privacy: .public)") } return nil } From 57467c9a27f1ed03d5e237513f6f394a81a5ed01 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 29 Nov 2025 09:02:52 +0000 Subject: [PATCH 2/2] fix(ios): not remove bookmark while resolve fails The failure may be temporary, and not removing the bookmark may alleviate the need for user interaction and frustration, but it does not solve the underlying problem, and the error will still occur silently. --- xcode/Shared/Preferences.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xcode/Shared/Preferences.swift b/xcode/Shared/Preferences.swift index 45c5a5fe..20f0b60e 100644 --- a/xcode/Shared/Preferences.swift +++ b/xcode/Shared/Preferences.swift @@ -237,7 +237,9 @@ private struct SecurityScopedBookmark { } var isStale = false guard let url = resolvBookmark(data, &isStale) else { // get security-scoped URL - SDefaults?.removeObject(forKey: key) // remove data that cannot be resolved + // Note: temporary mitigation measures for occasional failures on some iOS devices +// SDefaults?.removeObject(forKey: key) // remove data that cannot be resolved + logger?.warning("\(#function, privacy: .public) - faild resolv bookmark, return default") return defaultValue } if isStale, url.startAccessingSecurityScopedResource() { // renew URL bookmark