Flutter Supabase后台休眠6+小时后触发AuthRetryableFetchException问题求助
应用后台长时间闲置后Supabase全功能故障:握手异常导致无法恢复
问题描述
应用后台停留6-8小时或过夜后,所有Supabase请求均失败,抛出错误:
AuthRetryableFetchException(message: HandshakeException: Connection terminated during handshake, statusCode: null)
此前应用运行正常,认证、数据库读写、存储及Realtime功能均无异常。故障出现后:
- 所有Supabase操作(auth、postgrest、storage、realtime)均失败
- Realtime的
.onClose触发但无法重连 - 即使存在可重试异常,客户端也无法恢复
- 仅完全重启应用可解决问题
该故障仅在应用从长时间闲置状态恢复后出现。
复现步骤
- 正常登录应用(功能正常)
- 使用任意Supabase功能——所有操作均成功
- 将应用置于后台,闲置6小时以上(过夜)
- 次日重新打开应用,执行任意Supabase操作(查询、存储、Realtime等)
- 观察到上述错误
预期行为
应用从长时间闲置状态恢复时:
- Supabase客户端应刷新会话令牌(已启用自动刷新)
- TLS握手应成功
- Realtime应重新连接
- PostgREST、Storage及Auth请求应正常工作
恢复后不应出现致命握手或可重试异常
版本信息
Flutter SDK Flutter: 3.35.4 (stable) Dart: 3.9.2 iOS: 18.6.2 (真实设备) ├── supabase_flutter 2.10.3 │ ├── supabase 2.10.0 │ │ ├── functions_client 2.5.0 │ │ ├── gotrue 2.16.0 │ │ ├── postgrest 2.5.0 │ │ ├── realtime_client 2.6.0 │ │ ├── storage_client 2.4.1
Supabase初始化代码
await Supabase.initialize( url: dotenv.get('****'), anonKey: dotenv.get('****'), httpClient: SupabaseHttpInterceptor(http.Client()), realtimeClientOptions: RealtimeClientOptions( logLevel: RealtimeLogLevel.info, ), authOptions: const FlutterAuthClientOptions( autoRefreshToken: true, ), );
额外上下文
- 问题出现在多台真实iOS设备(iPhone 11等)上
- 应用其他网络功能正常,仅Supabase握手失败
- 疑似与长时间闲置+TLS会话恢复+认证刷新相关
- 恢复后Realtime的
.onClose会打印日志 - 重连尝试静默失败
- 除重启外无永久解决办法
Sentry日志(已脱敏)
AuthRetryableFetchException(message: HandshakeException: Connection terminated during handshake, statusCode: null)
- 设备:iPhone 11
- iOS:18.6.2
- 架构:arm64
- Flutter:3.35.4
- Dart:3.9.2
- supabase_flutter: ^2.10.3
- 环境:生产环境
故障流程
应用运行 → 后台(6-8小时)→ 恢复应用
↓
Supabase尝试握手+令牌刷新
↓
❌ HandshakeException(TLS终止)
❌ AuthRetryableFetchException
❌ Realtime断开连接且无法重连
❌ 所有PostgREST/Storage/Auth调用失败
内容的提问来源于stack exchange,提问作者vishal visvakarma
相关产品推荐
相关产品推荐

