From 3cb5b1d8a4a3a31133a1b9114d2416dafc6ae4ed Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 4 Jul 2026 19:57:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(iOS):=20connect=20flow=20=E2=80=94=20new=20?= =?UTF-8?q?SMB=20opens=20Files=20for=20auth,=20saved=20servers=20use=20Fil?= =?UTF-8?q?eManager=20directly.=20Both=20flows=20save=20to=20history.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/NetworkFileBrowser.swift | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Sources/NetworkFileBrowser.swift b/Sources/NetworkFileBrowser.swift index 0f9291d..5387799 100644 --- a/Sources/NetworkFileBrowser.swift +++ b/Sources/NetworkFileBrowser.swift @@ -422,13 +422,15 @@ struct NetworkFileBrowserIOS: View { } // MARK: - 连接逻辑 + /// iOS 必须通过 Files 应用认证 SMB。新连接先打开 Files 登录,之后 FileManager 可直接浏览 private func connectToServer(_ urlStr: String) { let t = urlStr.trimmingCharacters(in: .whitespaces) guard !t.isEmpty, let url = URL(string: t) else { return } isConnecting = true; connectError = nil; smbURL = t - DispatchQueue.global(qos: .userInitiated).async { + // 先尝试 FileManager 直接浏览(已认证过的共享) + DispatchQueue.global(qos: .userInitiated).async { [self] in do { let contents = try FileManager.default.contentsOfDirectory( at: url, includingPropertiesForKeys: [.isDirectoryKey, .fileSizeKey], @@ -440,19 +442,19 @@ struct NetworkFileBrowserIOS: View { DispatchQueue.main.async { self.items = fi; self.browseURL = url; self.isConnecting = false - // 保存到历史 - if !self.savedServers.contains(t) { - self.savedServers.insert(t, at: 0) - UserDefaults.standard.set(self.savedServers, forKey: "MiniPlayer.smbServers") - } + self.addToSaved(t) } } catch { + // FileManager 失败 → 需要通过 Files 认证 DispatchQueue.main.async { self.isConnecting = false - self.connectError = "Connection failed. Opening Files app..." - DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { - UIApplication.shared.open(url) { ok in - self.connectError = ok ? "Login in Files, then come back." : "Invalid URL" + self.addToSaved(t) // 先保存,下次就能直接浏览了 + // 打开 Files 应用认证 + UIApplication.shared.open(url) { ok in + if ok { + self.connectError = "Login in Files, then tap this server again." + } else { + self.connectError = "Cannot open. Check URL format." } } } @@ -460,6 +462,13 @@ struct NetworkFileBrowserIOS: View { } } + private func addToSaved(_ url: String) { + if !savedServers.contains(url) { + savedServers.insert(url, at: 0) + UserDefaults.standard.set(savedServers, forKey: "MiniPlayer.smbServers") + } + } + private func goUp() { if pathStack.isEmpty { browseURL = nil; items = [] } else { let p = pathStack.removeLast(); navigateTo(p) }