Firebase 분석에서 Floatter 화면을 추적하려면 어떻게 해야 합니까?
Flutter 앱이 있고 Flutter에서 Google Analytics의 Firebase를 테스트하고 있습니다.
저는 우리의 사용자들(글쎄요, 지금은 저)이 방문하는 경로를 보고 싶었습니다.의 설정 단계에 따라 예제 앱도 확인했습니다.디버그 보기 문서에 설명된 대로 분석에 대한 디버깅을 활성화했습니다.
유감스럽게도, 유일한 두 종류의 화면 보기 (firebase_screen_class
) 에 " " " "라는 메시지가 Flutter
그리고.MainActivity
.
볼 수 있을 거라 생각합니다./example-1
,/example-2
그리고./welcome
어딘가에, 하지만 난 없어요.
이것은 제가 Float에서 실행하고 있는 앱입니다.
class App extends StatelessWidget {
final FirebaseAnalytics analytics = FirebaseAnalytics();
@override
Widget build(BuildContext context) {
return MaterialApp(
routes: <String, WidgetBuilder>{
'/example-1': (_) => Example1(),
'/example-2': (_) => Example2(),
'/welcome': (_) => Welcome(),
},
home: Welcome(),
navigatorObservers: [FirebaseAnalyticsObserver(analytics: analytics)],
);
}
}
이 정확한 사용 사례는 화면 보기 추적 섹션의 Firebase Analytics 설명서에 나와 있습니다.
수동으로 화면을 추적하는 것은 앱이 게임과 같이 추적하고자 하는 각 화면에 대해 별도의 UIViewController 또는 Activity를 사용하지 않는 경우에 유용합니다.
Flutter가 화면 업데이트를 처리하고 있기 때문에 Flutter의 경우가 바로 그렇습니다. 대부분의 간단한 Flutter 앱은 하나만 실행됩니다.FlutterActivity
/FlutterAppDelegate
다양한 화면 렌더링을 자체적으로 처리하므로 Firebase Analytics가 화면을 자동으로 추적할 수는 없습니다.
내 과거 경험에 따르면,FirebaseAnalyticsObserver
별로 도움이 되지는 않았지만, 그들의 문서를 다시 확인하는 것이 좋습니다. 그들은 일이 "그냥 작동해야" 한다는 것을 암시합니다.제 추측으로는 제가 사용하지 않았기 때문에 잘 작동하지 않았습니다.RouteSettings
내가 가는 길 중 어느 곳에.
에 경우.FirebaseAnalyticsObserver
당신의 앱에 적용하거나 작동하지 않을 것입니다. 다음 접근법은 지난 몇 달간 개발 기간 동안 저에게 꽤 잘 작동했습니다.
은 현화면설수있다습니정으로 할 수 .FirebaseAnalytics
언제든지 화면 이름으로 메서드를 호출할 경우:
import 'package:firebase_analytics/firebase_analytics.dart';
// Somewhere in your widgets...
FirebaseAnalytics().setCurrentScreen(screenName: 'Example1');
첫 번째 시도로 위젯 생성자에서 이 작업을 수행했지만 제대로 작동하지 않고 이벤트 수를 잘못 계산합니다. 경로를 열거나 푸시하면 최상위 경로만 "현재 화면"으로 지정되더라도 스택의 모든 위젯 생성자가 호출됩니다.
이를 해결하기 위해서는 클래스를 사용하고 상위 경로일 경우에만 현재 화면을 설정해야 합니다. 즉, 우리의 경로가 스택에 추가되거나 이전 상위 경로가 팝업되어 해당 경로에 도착했습니다.
RouteAware
보일러 플레이트 코드와 함께 제공되며 모든 화면에 해당 보일러 플레이트를 반복하고 싶지 않습니다.작은 앱도 수십 개의 다른 화면을 가지고 있기 때문에 제가 만든 것은RouteAwareAnalytics
혼합 위치:
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/widgets.dart';
// A Navigator observer that notifies RouteAwares of changes to state of their Route
final routeObserver = RouteObserver<PageRoute>();
mixin RouteAwareAnalytics<T extends StatefulWidget> on State<T>
implements RouteAware {
AnalyticsRoute get route;
@override
void didChangeDependencies() {
routeObserver.subscribe(this, ModalRoute.of(context));
super.didChangeDependencies();
}
@override
void dispose() {
routeObserver.unsubscribe(this);
super.dispose();
}
@override
void didPop() {}
@override
void didPopNext() {
// Called when the top route has been popped off,
// and the current route shows up.
_setCurrentScreen(route);
}
@override
void didPush() {
// Called when the current route has been pushed.
_setCurrentScreen(route);
}
@override
void didPushNext() {}
Future<void> _setCurrentScreen(AnalyticsRoute analyticsRoute) {
print('Setting current screen to $analyticsRoute');
return FirebaseAnalytics().setCurrentScreen(
screenName: screenName(analyticsRoute),
screenClassOverride: screenClass(analyticsRoute),
);
}
}
다음을 생성했습니다.enum
화면을 추적합니다(및 열거형을 화면 이름으로 바꾸는 기능).저는 모든 경로를 쉽게 추적하고 경로 이름을 리팩터하기 위해 열거형을 사용했습니다.이러한 열거형과 함수를 사용하여 가능한 모든 값을 단위로 테스트하고 일관된 이름을 지정할 수 있습니다. 실수로 인한 공백이나 특수 문자, 일관되지 않은 대문자 표시가 없습니다.화면 클래스 값을 결정하는 더 나은 다른 방법이 있을 수 있지만, 저는 이 접근법을 사용했습니다.
enum AnalyticsRoute { example }
String screenClass(AnalyticsRoute route) {
switch (route) {
case AnalyticsRoute.example:
return 'ExampleRoute';
}
throw ArgumentError.notNull('route');
}
String screenName(AnalyticsRoute route) {
switch (route) {
case AnalyticsRoute.example:
return '/example';
}
throw ArgumentError.notNull('route');
}
는 초기설다다같다니습과를 하는 것입니다.routeObserver
navigatorObserver
의 신의의MaterialApp
:
MaterialApp(
// ...
navigatorObservers: [
routeObserver,
// FirebaseAnalyticsObserver(analytics: FirebaseAnalytics()),
],
);
마지막으로 추적되는 첫 번째 예제 경로를 추가할 수 있습니다.추가합니다.with RouteAwareAnalytics
당신의 주에 그리고 오버라이드.get route
.
class ExampleRoute extends StatefulWidget {
@override
_ExampleRouteState createState() => _ExampleRouteState();
}
class _ExampleRouteState extends State<ExampleRoute> with RouteAwareAnalytics{
@override
Widget build(BuildContext context) => Text('Example');
@override
AnalyticsRoute get route => AnalyticsRoute.example;
}
새 경로를 추가할 때마다 적은 노력으로 추가할 수 있습니다. 먼저 새 열거값을 추가한 다음 Dart 컴파일러가 다음에 추가할 내용을 안내합니다. 화면 이름 및 클래스 재정의 값을 각각 추가합니다.switch-case
그런 다음 경로를 구축하는 주를 찾아 추가합니다.with RouteAwareAnalytics
추니다합을 합니다.route
더 좋은
*
사용하지 않은 이유RouteSettings
저는 사이먼 라이트풋의 접근 방식을 선호합니다.Object
설정에서 제공하는 인수:
class ExampleRoute extends StatefulWidget {
const ExampleRoute._({@required this.integer, Key key}) : super(key: key);
// All types of members are supported, but I used int as example
final int integer;
static Route<void> route({@required int integer}) =>
MaterialPageRoute(
// I could add the settings here, though, it wouldn't enforce good types
builder: (_) => ExampleRoute._(integer: integer),
);
// ...
}
탐색 관찰자 추가
MaterialApp에 Firebase 분석 탐색 관찰자 추가:
class MyApp extends StatelessWidget {
FirebaseAnalytics analytics = FirebaseAnalytics();
...
MaterialApp(
home: MyAppHome(),
navigatorObservers: [
FirebaseAnalyticsObserver(analytics: analytics), // <-- here
],
);
바로 그거야!분석 내용이 DebugView에 표시됩니다.
참고!
앱에 분석 기능을 처음 통합하는 경우 대시보드에 분석 기능이 표시되는 데 하루 정도 걸립니다.
바로 결과 보기
디버그 결과를 바로 보려면 터미널에서 위의 명령을 실행한 다음 디버그 보기에 표시되는지 확인합니다.
adb shell setprop debug.firebase.analytics.app [your_app_package_name]
맛있게 드세요!
저는 얼마 동안 이 문제를 경험했고 그것이 작동하도록 만들 수 있었습니다.
문제는 MaterialPageRoute의 설정을 제대로 전달하지 못하고 있다는 것입니다.
return MaterialPageRoute(
settings: RouteSettings(
name: routeName,
),
builder: (_) => viewToShow);
}
FilledStack에 대한 튜토리얼을 따르며 샘플 코드를 보고 문제를 파악할 수 있었습니다.
여러분이 이신당를보 ""에서"Flutter"를보고 ,firebase_screen_class
의 파라미터screen_view
이벤트, 이는 이벤트가 올바르게 구성되었음을 의미합니다.
은 당신신은합가다찾음아니다에서 이 기대하는 합니다.firebase_screen
변수, 매변수 대 "firebase_screen_class
.
또한 확인할 가치가 있습니다.firebase_previous_screen
매개 변수를 사용하여 이전에 열려 있던 화면을 확인할 수 있습니다.
언급URL : https://stackoverflow.com/questions/55830575/how-do-i-track-flutter-screens-in-firebase-analytics
'programing' 카테고리의 다른 글
Matplotlib의 빈 크기(히스토그램) (0) | 2023.06.04 |
---|---|
Java Apache POI Excel PDF로 저장 (0) | 2023.06.04 |
루비 객체가 부울 객체인지 확인하는 방법 (0) | 2023.06.04 |
설치된 보석 목록? (0) | 2023.06.04 |
콘솔의 같은 위치에 출력을 쓰려면 어떻게 해야 합니까? (0) | 2023.06.04 |