iOS Swift应用启动时Supabase auth.refreshSession报错「The network connection was lost」
iOS Swift应用启动时Supabase auth.refreshSession报错「The network connection was lost」
嘿,我之前做Swift + Supabase的iOS项目时,完完全全踩过这个一模一样的坑!启动页刚加载就调用refreshSession,直接弹出网络连接丢失的错误,折腾了快一下午才摸清楚问题根源,给你分享几个亲测有效的排查和解决方向:
别着急在启动初期就发起请求:iOS刚启动那会儿,系统的网络栈其实还没完全初始化好,这时候发网络请求很容易扑街。我之前是把
getCurrentUser()的调用时机,从App启动的init或者页面onAppear,改到了App进入活跃状态之后——比如用NotificationCenter监听UIApplication.didBecomeActiveNotification,等App真正跑起来再触发请求,一下子就减少了大半报错的情况。确保Supabase客户端是全局单例:之前我犯了个低级错误,在ViewModel里临时创建SupabaseClient实例,结果请求发出去没多久实例就被释放了,直接导致请求中断报网络错。一定要把客户端做成全局单例,比如:
import Supabase // 全局单例,确保整个App生命周期都持有 let supabase = SupabaseClient( supabaseURL: URL(string: "你的Supabase地址")!, supabaseKey: "你的Anon Key"! )
这样请求的时候就不会因为实例被回收而失败了。
- 手动刷新的正确姿势:其实Supabase Auth本身有自动刷新会话的机制,但如果一定要手动调用
refreshSession,记得先检查当前有没有有效会话再操作,而且碰到网络错误可以重试一次——毕竟启动时的网络波动很常见。我当时在catch块里加了个简单的重试逻辑:
@MainActor func getCurrentUser() async { isLoading = true authError = nil defer { isLoading = false } do { if let currentSession = supabase.auth.currentSession { let refreshedSession = try await supabase.auth.refreshSession(session: currentSession) // 这里处理刷新后的会话逻辑 } else { // 没有会话的话,引导用户登录就好 } } catch { authError = error.localizedDescription // 碰到网络连接丢失的错误,延迟1秒重试一次 if let supabaseError = error as? SupabaseError, supabaseError.localizedDescription.contains("The network connection was lost") { try? await Task.sleep(nanoseconds: 1_000_000_000) await getCurrentUser() } } }
- 排查ATS和网络权限:虽然现在iOS默认允许HTTPS请求,但还是去Info.plist里确认下ATS配置有没有瞎改,别不小心禁用了HTTPS访问;另外,确保App的Info.plist里加了网络权限(
NSAppTransportSecurity下面的NSAllowsArbitraryLoads如果是NO的话,要确保Supabase的URL在例外里,不过Supabase本身都是HTTPS,一般不用额外配置)。
我当时主要就是把调用时机改到App活跃后,再加上单例的正确配置,这个报错就再也没出现过了,你可以挨个试试这些方向!
内容来源于stack exchange
相关产品推荐
相关产品推荐

