分析与监控
Firebase/Mixpanel/GA。
分析与监控
这一课你将能做到
- 用 Firebase Analytics 埋点:页面浏览、自定义事件、用户属性
- 用 Firebase Performance Monitoring 监控 App 启动时间、网络请求、自定义 trace
- 用 Crashlytics 抓崩溃 + 自定义日志,搭建「数据 → 看板 → 决策」的闭环
为什么要学
上架只是开始。没有数据就是瞎开船:用户在哪一步流失?哪个页面最卡?哪个版本崩溃最多?分析和监控让这些问题有答案。
人话:Analytics 告诉你「用户在做什么」,Performance 告诉你「App 跑得多快」,Crashlytics 告诉你「App 在哪里挂了」。三件套凑齐就是 App 的「仪表盘 + 黑匣子」。
先建立图像
用户行为 ──┐
├──► Firebase Analytics → 留存/漏斗/转化
App 性能 ──┼──► Firebase Performance → 启动耗时/网络耗时
│
崩溃异常 ──┴──► Firebase Crashlytics → 崩溃率/堆栈/影响用户
跟着做
步骤 1:接入依赖
dependencies:
firebase_core: ^2.24.0
firebase_analytics: ^10.8.0
firebase_performance: ^0.9.3
firebase_crashlytics: ^3.4.0
main.dart 初始化(前面 Firebase 课已经讲过):
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;
PlatformDispatcher.instance.onError = (e, s) {
FirebaseCrashlytics.instance.recordError(e, s, fatal: true);
return true;
};
runApp(const MyApp());
}
步骤 2:页面浏览埋点(自动 + 手动)
Firebase Analytics 提供 FirebaseAnalyticsObserver,挂到 MaterialApp 就能自动记录路由切换:
import 'package:firebase_analytics/firebase_analytics.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
static FirebaseAnalytics analytics = FirebaseAnalytics.instance;
static FirebaseAnalyticsObserver observer =
FirebaseAnalyticsObserver(analytics: analytics);
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [observer],
home: const HomePage(),
);
}
}
自动收集的是路由名,业务事件还是要手动埋。
步骤 3:自定义事件与用户属性
class Analytics {
static final _a = FirebaseAnalytics.instance;
// 自定义事件
static Future<void> logLogin(String method) =>
_a.logLogin(loginMethod: method); // 预定义事件
static Future<void> logAddToCart(String itemId, double price) =>
_a.logAddToCart(
items: [AnalyticsEventItem(itemId: itemId, price: price)],
value: price,
currency: 'CNY',
);
static Future<void> logCustom(String name, Map<String, Object> params) =>
_a.logEvent(name: name, parameters: params);
// 用户属性(用于分群)
static Future<void> setUserProps({required String userId, String? plan}) async {
await _a.setUserId(id: userId);
if (plan != null) await _a.setUserProperty(name: 'plan', value: plan);
}
}