diff --git a/frontend/genex-mobile/lib/core/telemetry/telemetry_service.dart b/frontend/genex-mobile/lib/core/telemetry/telemetry_service.dart index 7da60b0..6272bf9 100644 --- a/frontend/genex-mobile/lib/core/telemetry/telemetry_service.dart +++ b/frontend/genex-mobile/lib/core/telemetry/telemetry_service.dart @@ -45,6 +45,16 @@ class TelemetryService { bool _isInitialized = false; bool get isInitialized => _isInitialized; + /// 初始化完成前的事件缓冲队列 + /// + /// 解决启动时序问题:initialize() 是异步的(需要收集设备信息、 + /// 加载配置等),而 RouteObserver/auth 事件可能在初始化完成前 + /// 就已触发。将这些事件缓存,初始化完成后统一 replay,确保不丢失。 + /// + /// 上限 50 条,防止极端情况下内存积累。 + final List<_PendingEvent> _preInitBuffer = []; + static const int _maxPreInitBuffer = 50; + /// 会话管理器 late SessionManager _sessionManager; @@ -135,6 +145,16 @@ class TelemetryService { debugPrint('📊 TelemetryService initialized'); debugPrint(' InstallId: $_installId'); debugPrint(' UserId: $_userId'); + + // Replay 初始化前缓冲的事件(如 page_view、session 启动事件等) + if (_preInitBuffer.isNotEmpty) { + debugPrint('📊 [Telemetry] Replaying ${_preInitBuffer.length} buffered pre-init events'); + final buffered = List<_PendingEvent>.from(_preInitBuffer); + _preInitBuffer.clear(); + for (final e in buffered) { + logEvent(e.eventName, type: e.type, level: e.level, properties: e.properties); + } + } } /// 初始化 installId @@ -167,7 +187,15 @@ class TelemetryService { Map? properties, }) { if (!_isInitialized) { - debugPrint('⚠️ TelemetryService not initialized, event ignored'); + // 缓冲事件,等初始化完成后 replay,不丢弃 + if (_preInitBuffer.length < _maxPreInitBuffer) { + _preInitBuffer.add(_PendingEvent( + eventName: eventName, + type: type, + level: level, + properties: properties, + )); + } return; } @@ -394,3 +422,18 @@ class TelemetryService { _instance = null; } } + +/// 初始化前缓冲的待处理事件(内部使用) +class _PendingEvent { + final String eventName; + final EventType type; + final EventLevel level; + final Map? properties; + + const _PendingEvent({ + required this.eventName, + required this.type, + required this.level, + this.properties, + }); +}