Firebase analytics és crashlytics használatának beállítása a FirebaseLogger-ben.
This commit is contained in:
@@ -14,6 +14,8 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:terepi_seged/services/app_logger.dart';
|
||||
import 'package:terepi_seged/services/firebase_logger.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
import '../models/device_info_model.dart';
|
||||
@@ -58,6 +60,11 @@ class DeviceIdentityService extends GetxService {
|
||||
// Háttérben regisztrálás — nem blokkolja az UI-t
|
||||
unawaited(_registerDevice());
|
||||
_isReady = true;
|
||||
|
||||
FirebaseLogger.setDeviceIdentifier(info.deviceId, deviceLabel.value);
|
||||
FirebaseLogger.setKey('model', model);
|
||||
FirebaseLogger.setKey('os_version', osInfo);
|
||||
FirebaseLogger.setKey('app_version', appInfo);
|
||||
}
|
||||
|
||||
// ── Betöltés ──────────────────────────────────────────────────────
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
// Firebase alapú log service — Crashlytics + Analytics
|
||||
//
|
||||
// Crashlytics: breadcrumb log, hiba rögzítés, egyedi attribútumok
|
||||
// Analytics: egyedi esemény tracking (warning-ok, hibák, fontos események)
|
||||
//
|
||||
// Éles appban is működik — kiegészíti az AppLogger-t (ami csak debug módban fut)
|
||||
//
|
||||
// Használat:
|
||||
// FirebaseLogger.i('startRecording', 'Track indítva: $name');
|
||||
// FirebaseLogger.w('_onPosition', 'Ugrás kiszűrve: ${dist}m');
|
||||
// FirebaseLogger.e('positionStream', 'GPS hiba', error: e, stack: s);
|
||||
// FirebaseLogger.event('track_completed', {'distance_m': 3200, 'points': 142});
|
||||
|
||||
import 'package:firebase_analytics/firebase_analytics.dart';
|
||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class FirebaseLogger extends GetxService {
|
||||
static FirebaseLogger get to => Get.find();
|
||||
|
||||
// ── Belső referenciák ─────────────────────────────────────────────
|
||||
|
||||
late final FirebaseCrashlytics _crashlytics;
|
||||
late final FirebaseAnalytics _analytics;
|
||||
|
||||
bool _isReady = false;
|
||||
|
||||
// ── Lifecycle ─────────────────────────────────────────────────────
|
||||
|
||||
@override
|
||||
Future<void> onReady() async {
|
||||
super.onReady();
|
||||
try {
|
||||
_crashlytics = FirebaseCrashlytics.instance;
|
||||
_analytics = FirebaseAnalytics.instance;
|
||||
|
||||
// Crashlytics engedélyezése — release-ben mindig, debug-ban opcionális
|
||||
await _crashlytics.setCrashlyticsCollectionEnabled(!kDebugMode);
|
||||
|
||||
// Eszközazonosító beállítása ha már elérhető
|
||||
_setDeviceInfo();
|
||||
|
||||
_isReady = true;
|
||||
_crashlytics.log('FirebaseLogger inicializálva');
|
||||
} catch (e) {
|
||||
debugPrint('FirebaseLogger init hiba: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// ── Publikus API — ugyanolyan mint AppLogger ──────────────────────
|
||||
|
||||
/// Info szintű log — Crashlytics breadcrumb
|
||||
static void i(String tag, String message) {
|
||||
_breadcrumb('I', tag, message);
|
||||
}
|
||||
|
||||
/// Figyelmeztetés — breadcrumb + Analytics esemény
|
||||
static void w(String tag, String message, {Object? error}) {
|
||||
_breadcrumb('W', tag, message);
|
||||
_logWarningEvent(tag, message, error: error);
|
||||
}
|
||||
|
||||
/// Hiba — Crashlytics recordError + Analytics esemény
|
||||
static void e(
|
||||
String tag,
|
||||
String message, {
|
||||
Object? error,
|
||||
StackTrace? stack,
|
||||
bool fatal = false,
|
||||
}) {
|
||||
_breadcrumb('E', tag, message);
|
||||
|
||||
if (error != null) {
|
||||
try {
|
||||
FirebaseLogger.to._crashlytics.recordError(
|
||||
error,
|
||||
stack,
|
||||
reason: '[$tag] $message',
|
||||
fatal: fatal,
|
||||
printDetails: kDebugMode,
|
||||
information: ['tag: $tag', 'message: $message'],
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
_logErrorEvent(tag, message, error: error);
|
||||
}
|
||||
|
||||
/// Szeparátor — jól látható elválasztó a Crashlytics logban
|
||||
static void separator(String label) {
|
||||
_breadcrumb('─', '─────', '─── $label ───────────────────────');
|
||||
}
|
||||
|
||||
/// Egyedi Analytics esemény — tetszőleges adatokkal
|
||||
static void event(
|
||||
String name, [
|
||||
Map<String, Object>? parameters,
|
||||
]) {
|
||||
try {
|
||||
FirebaseLogger.to._analytics.logEvent(
|
||||
name: _sanitizeEventName(name),
|
||||
parameters: parameters,
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
/// Egyedi Crashlytics attribútum beállítása
|
||||
static void setKey(String key, dynamic value) {
|
||||
try {
|
||||
FirebaseLogger.to._crashlytics.setCustomKey(key, value);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
// ── Eszközinfo beállítása ─────────────────────────────────────────
|
||||
|
||||
void _setDeviceInfo() {
|
||||
try {
|
||||
// DeviceIdentityService ha már elérhető
|
||||
if (Get.isRegistered<dynamic>()) {
|
||||
final deviceService = Get.find(tag: 'DeviceIdentityService');
|
||||
_crashlytics.setUserIdentifier(deviceService.deviceId ?? '');
|
||||
}
|
||||
} catch (_) {
|
||||
// DeviceIdentityService még nem regisztrált — nem baj
|
||||
}
|
||||
}
|
||||
|
||||
/// Crashlytics azonosító frissítése ha a DeviceIdentityService betöltött
|
||||
static void setDeviceIdentifier(String deviceId, String label) {
|
||||
try {
|
||||
FirebaseLogger.to._crashlytics.setUserIdentifier(deviceId);
|
||||
FirebaseLogger.to._crashlytics.setCustomKey('device_label', label);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
// ── Belső segédek ─────────────────────────────────────────────────
|
||||
|
||||
static void _breadcrumb(String level, String tag, String message) {
|
||||
try {
|
||||
final line = '$level [$tag] $message';
|
||||
FirebaseLogger.to._crashlytics.log(line);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
static void _logWarningEvent(
|
||||
String tag,
|
||||
String message, {
|
||||
Object? error,
|
||||
}) {
|
||||
try {
|
||||
FirebaseLogger.to._analytics.logEvent(
|
||||
name: 'app_warning',
|
||||
parameters: {
|
||||
'tag': _trim(tag, 40),
|
||||
'message': _trim(message, 100),
|
||||
if (error != null) 'error': _trim(error.toString(), 100),
|
||||
},
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
static void _logErrorEvent(
|
||||
String tag,
|
||||
String message, {
|
||||
Object? error,
|
||||
}) {
|
||||
try {
|
||||
FirebaseLogger.to._analytics.logEvent(
|
||||
name: 'app_error',
|
||||
parameters: {
|
||||
'tag': _trim(tag, 40),
|
||||
'message': _trim(message, 100),
|
||||
if (error != null) 'error': _trim(error.toString(), 100),
|
||||
},
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
/// Analytics eseménynevek csak betűt, számot és _ -t tartalmazhatnak
|
||||
static String _sanitizeEventName(String name) =>
|
||||
name.replaceAll(RegExp(r'[^a-zA-Z0-9_]'), '_').substring(
|
||||
0,
|
||||
name.length.clamp(0, 40),
|
||||
);
|
||||
|
||||
/// Analytics paraméter érték max 100 karakter
|
||||
static String _trim(String s, int max) =>
|
||||
s.length > max ? s.substring(0, max) : s;
|
||||
}
|
||||
Reference in New Issue
Block a user