From a7b1199facbcd0b43447884707256d4b4cffdc52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Thu, 8 Jan 2026 22:07:02 +0800 Subject: [PATCH] Fix destroying working directory --- .../Views/Setting/CoreView.swift | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/ApplicationLibrary/Views/Setting/CoreView.swift b/ApplicationLibrary/Views/Setting/CoreView.swift index 62acd62..1365e24 100644 --- a/ApplicationLibrary/Views/Setting/CoreView.swift +++ b/ApplicationLibrary/Views/Setting/CoreView.swift @@ -178,10 +178,15 @@ public struct CoreView: View { if Variant.useSystemExtension { try RootHelperClient.shared.cleanWorkingDirectory() } else { - try FileManager.default.removeItem(at: FilePath.workingDirectory) + try clearWorkingDirectoryContents() } #else - try FileManager.default.removeItem(at: FilePath.workingDirectory) + try clearWorkingDirectoryContents() + #if os(iOS) + if #available(iOS 16.0, *) { + await notifyFileProviderWorkingDirectoryChanged() + } + #endif #endif isLoading = true } catch { @@ -189,6 +194,17 @@ public struct CoreView: View { } } + private func clearWorkingDirectoryContents() throws { + let url = FilePath.workingDirectory + guard FileManager.default.fileExists(atPath: url.path) else { + return + } + let contents = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil) + for item in contents { + try FileManager.default.removeItem(at: item) + } + } + #if os(macOS) private func helperRequiredAlert() -> AlertState { AlertState( @@ -203,16 +219,35 @@ public struct CoreView: View { #endif #if os(iOS) + @available(iOS 16.0, *) + private nonisolated func fileProviderManager() async throws -> NSFileProviderManager { + let domains = try await NSFileProviderManager.domains() + guard let domain = domains.first(where: { $0.identifier.rawValue == AppConfiguration.fileProviderDomainID }) else { + throw NSError(domain: "CoreView", code: 0, userInfo: [NSLocalizedDescriptionKey: "File provider domain not found"]) + } + guard let manager = NSFileProviderManager(for: domain) else { + throw NSError(domain: "CoreView", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to get file provider manager"]) + } + return manager + } + + @available(iOS 16.0, *) + private nonisolated func notifyFileProviderWorkingDirectoryChanged() async { + do { + let manager = try await fileProviderManager() + try await manager.signalEnumerator(for: .rootContainer) + try await manager.signalEnumerator(for: .workingSet) + } catch { + await MainActor.run { + alert = AlertState(error: error) + } + } + } + @available(iOS 16.0, *) private nonisolated func openInFilesApp() async { do { - let domains = try await NSFileProviderManager.domains() - guard let domain = domains.first(where: { $0.identifier.rawValue == AppConfiguration.fileProviderDomainID }) else { - throw NSError(domain: "CoreView", code: 0, userInfo: [NSLocalizedDescriptionKey: "File provider domain not found"]) - } - guard let manager = NSFileProviderManager(for: domain) else { - throw NSError(domain: "CoreView", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to get file provider manager"]) - } + let manager = try await fileProviderManager() try await manager.signalEnumerator(for: .workingSet) let url = try await manager.getUserVisibleURL(for: .rootContainer) guard let sharedURL = URL(string: "shareddocuments://\(url.path)") else {