fix(app): App-Reconnect nach Hintergrund — Sticky-Fallback, Zombie-WS, AppState-Hook
Stefan musste seit der HTTPS-Umstellung nach jedem Hintergrund-Rueckkehr manuell auf "Verbinden" tippen, meist 3x bis es ging. Gleiche Bug-Klasse wie auf der Bridge davor (Sticky-Fallback), plus zwei App-spezifische Symptome. Drei Ursachen: 1. usingTLSFallback klebt: einmal nach onerror auf true gesetzt, blieb es bei allen folgenden Reconnects → App versuchte ws://...:443 gegen den TLS-only Caddy → HTTP 400 → endlos. Reset war NUR im manuellen connect(), nicht in onclose oder scheduleReconnect. Fix: in onclose `usingTLSFallback = false` damit der naechste Reconnect wieder primary (wss://) probiert. 2. Zombie-WebSocket: Android kann den TCP-Socket im Background still killen, der JS-State zeigt aber noch readyState === OPEN. Stefans manueller "Verbinden"-Klick rief connect() → "Bereits verbunden" No-Op statt sich neu aufzubauen. Fix: connect(force=true) optional, bestehendes WS-Objekt wird hart geschlossen (mit onclose=null gegen Doppel-Reconnect) bevor neuer Aufbau startet. 3. Keine aktive Reconnect-Sequence bei Foreground-Resume: App war abhaengig von onclose-Events die bei Zombie-WS nicht zwingend feuern. Fix: AppState-Listener in App.tsx, bei background → active automatischer rvs.connect(true). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+19
-1
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
import React, { useEffect } from 'react';
|
||||
import { PermissionsAndroid, Platform, StatusBar, StyleSheet } from 'react-native';
|
||||
import { AppState, AppStateStatus, PermissionsAndroid, Platform, StatusBar, StyleSheet } from 'react-native';
|
||||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
import { NavigationContainer, DefaultTheme } from '@react-navigation/native';
|
||||
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
||||
@@ -107,8 +107,26 @@ const App: React.FC = () => {
|
||||
console.warn('[App] GPS-Tracking restore fehlgeschlagen:', err?.message || err);
|
||||
});
|
||||
|
||||
// AppState-Listener: nach Hintergrund-Rueckkehr aktiv die WS-
|
||||
// Verbindung neu aufbauen. Hintergrund: Android kann den TCP-Socket
|
||||
// im Background killen, JS-State zeigt aber noch OPEN → Stefan musste
|
||||
// manuell in Settings auf "Verbinden" tippen, oft mehrfach. Mit dem
|
||||
// force-Reconnect bei "active" greift das automatisch.
|
||||
let lastAppState: AppStateStatus = AppState.currentState;
|
||||
const appStateSub = AppState.addEventListener('change', (next) => {
|
||||
const wasBg = lastAppState !== 'active';
|
||||
lastAppState = next;
|
||||
if (next === 'active' && wasBg) {
|
||||
console.log('[App] Foreground-Resume — force-reconnect zum RVS');
|
||||
try { rvs.connect(true); } catch (e: any) {
|
||||
console.warn('[App] force-reconnect fehlgeschlagen:', e?.message || e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Beim Beenden: Verbindung sauber trennen
|
||||
return () => {
|
||||
appStateSub.remove();
|
||||
rvs.disconnect();
|
||||
};
|
||||
}, []);
|
||||
|
||||
Reference in New Issue
Block a user