Flutter数据分析跟踪插件snowplow_flutter_tracker的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter数据分析跟踪插件snowplow_flutter_tracker的使用

概述

snowplow_flutter_tracker 是一个Flutter插件,允许你在应用程序中集成Snowplow分析功能。通过这个插件,你可以从Flutter应用程序、游戏或框架中收集事件数据。

开始使用

1. 初始化跟踪器

首先,你需要初始化跟踪器并设置发射器(Emitter)。发射器负责将事件发送到Snowplow服务器。以下是初始化的示例代码:

import 'package:snowplow_flutter_tracker/snowplow_flutter_tracker.dart';

void main() {
  // 创建发射器,指定Snowplow服务器的URL
  final emitter = Emitter(uri: 'your-collector-endpoint-url');

  // 创建跟踪器,设置命名空间和应用ID
  final tracker = Tracker(
    emitter: emitter,
    namespace: 'your-namespace',
    appId: 'your-appId',
    logLevel: LogLevel.verbose, // 设置日志级别为详细
  );

  // 初始化Snowplow跟踪器
  final _tracker = SnowplowFlutterTracker(tracker);
  _tracker.initialize();

  runApp(MyApp());
}
2. 发送自定义事件

你可以通过SelfDescribing类发送自定义事件。以下是一个发送自定义事件的示例:

final selfDescribingJson = SelfDescribingJson(
  schema: 'iglu:com.acme/event/jsonschema/1-0-0', // 自定义事件的Schema
  payload: <String, Object>{'message': 'hello world'}, // 事件的有效负载
);

final selfDescribing = SelfDescribing(selfDescribingJson);
_tracker.track(selfDescribing); // 发送自定义事件
3. 发送结构化事件

结构化事件用于记录特定的用户操作。以下是一个发送结构化事件的示例:

final structured = Structured(
  category: 'shop', // 事件类别
  action: 'add-to-basket', // 事件动作
  label: 'Add To Basket', // 事件标签
  property: 'pcs', // 事件属性
  value: 2.00, // 事件值
);

_tracker.track(structured); // 发送结构化事件
4. 发送屏幕视图事件

屏幕视图事件用于记录用户查看某个页面或屏幕。以下是一个发送屏幕视图事件的示例:

final screenView = ScreenView(
  name: 'home', // 屏幕名称
  type: 'full', // 屏幕类型
  transitionType: 'none', // 过渡类型
  previousName: '', // 上一个屏幕名称
  previousType: '', // 上一个屏幕类型
);

_tracker.track(screenView); // 发送屏幕视图事件
5. 发送页面视图事件

页面视图事件用于记录用户查看某个网页。以下是一个发送页面视图事件的示例:

final pageView = PageViewEvent(
  pageUrl: 'https://www.google.com/', // 页面URL
  pageTitle: 'Google', // 页面标题
);

_tracker.track(pageView); // 发送页面视图事件
6. 发送计时事件

计时事件用于记录某个操作的持续时间。以下是一个发送计时事件的示例:

final timing = Timing(
  category: 'category', // 事件类别
  variable: 'variable', // 计时变量
  timing: 1, // 计时值(毫秒)
  label: 'label', // 事件标签
);

_tracker.track(timing); // 发送计时事件
7. 发送电子商务交易事件

电子商务交易事件用于记录用户的购买行为。以下是一个发送电子商务交易事件的示例:

final item = EcommerceTransactionItem(
  itemId: 'item_id_1', // 商品ID
  sku: 'item_sku_1', // 商品SKU
  price: 1.00, // 商品价格
  quantity: 1, // 商品数量
  name: 'item_name', // 商品名称
  category: 'item_category', // 商品类别
  currency: 'currency', // 货币类型
);

final ecommerceTransaction = EcommerceTransaction(
  orderId: '6a8078be', // 订单ID
  totalValue: 300.00, // 总金额
  affiliation: 'my_affiliate', // 关联信息
  taxValue: 30.00, // 税费
  shipping: 10.00, // 运费
  city: 'Boston', // 城市
  state: 'Massachusetts', // 州
  country: 'USA', // 国家
  currency: 'USD', // 货币类型
  items: [item], // 商品列表
);

_tracker.track(ecommerceTransaction); // 发送电子商务交易事件
8. 发送同意授予事件

同意授予事件用于记录用户授予某些权限的行为。以下是一个发送同意授予事件的示例:

final consentDocuments = [
  ConsentDocument(
    documentId: 'doc-id1', // 文档ID
    documentVersion: '1', // 文档版本
    documentName: 'doc-name1', // 文档名称
    documentDescription: 'doc-description1', // 文档描述
  ),
];

final consentGranted = ConsentGranted(
  documentId: '1234', // 文档ID
  documentVersion: '5', // 文档版本
  expiry: 'Monday, 19-Aug-05 15:52:01 UTC', // 到期时间
  documentName: 'Consent document', // 文档名称
  documentDescription: 'An example description', // 文档描述
  consentDocuments: consentDocuments, // 同意的文档列表
);

_tracker.track(consentGranted); // 发送同意授予事件
9. 发送同意撤回事件

同意撤回事件用于记录用户撤回某些权限的行为。以下是一个发送同意撤回事件的示例:

final consentDocuments = [
  ConsentDocument(
    documentId: 'doc-id1', // 文档ID
    documentVersion: '1', // 文档版本
    documentName: 'doc-name1', // 文档名称
    documentDescription: 'doc-description1', // 文档描述
  ),
];

final consentWithdrawn = ConsentWithdrawn(
  all: false, // 是否撤回所有权限
  documentId: '1234', // 文档ID
  documentVersion: '5', // 文档版本
  documentName: 'Consent document', // 文档名称
  documentDescription: 'An example description', // 文档描述
  consentDocuments: consentDocuments, // 撤回的文档列表
);

_tracker.track(consentWithdrawn); // 发送同意撤回事件
10. 发送推送通知事件

推送通知事件用于记录用户接收到的推送通知。以下是一个发送推送通知事件的示例:

final notificationContent = NotificationContent(
  title: 'You received a new message', // 通知标题
  body: 'You received a new message', // 通知内容
  badge: 1, // 通知角标
);

final pushNotification = PushNotification(
  action: 'Message Received', // 通知动作
  deliveryDate: DateTime.now().toString(), // 通知送达时间
  trigger: 'message_received', // 触发条件
  categoryIdentifier: '1', // 类别标识符
  threadIdentifier: '1', // 线程标识符
  notificationContent: notificationContent, // 通知内容
);

_tracker.track(pushNotification); // 发送推送通知事件

本地测试

通常运行Snowplow服务器需要在AWS或Google Cloud上部署。为了简化本地测试,你可以使用Snowplow Dummy Server。这个服务器会将请求打印到控制台,帮助你验证应用是否配置正确。

  1. 进入服务器目录:

    cd snowplow_dummy_server
    
  2. 启动服务器,默认运行在127.0.0.1:8080

    dart bin/main.dart
    
  3. 在示例应用中,默认情况下会向127.0.0.1:8080发送请求。这在使用iOS模拟器时效果良好。如果你使用物理设备或Android模拟器,你需要使用代理。

完整示例Demo

以下是一个完整的示例应用,展示了如何使用snowplow_flutter_tracker插件来发送各种类型的事件:

import 'package:flutter/material.dart';
import 'package:snowplow_flutter_tracker/snowplow_flutter_tracker.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late SnowplowFlutterTracker _tracker;

  [@override](/user/override)
  void initState() {
    // 尝试使用运行在localhost上的snowplow_dummy_server。这在使用iOS模拟器时效果良好。
    // 如果使用物理设备或Android模拟器,你需要使用代理。
    // 你也可以将其更改为自己的Snowplow服务器。
    final emitter = Emitter(uri: '127.0.0.1:8080');
    final tracker = Tracker(
      emitter: emitter,
      namespace: 'your-namespace',
      appId: 'your-appId',
      logLevel: LogLevel.verbose,
    );
    _tracker = SnowplowFlutterTracker(tracker);
    _tracker.initialize();

    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Snowplow Flutter Tracker Example'),
        ),
        body: SingleChildScrollView(
          padding: const EdgeInsets.symmetric(vertical: 24.0),
          child: Center(
            child: Column(
              children: <Widget>[
                ElevatedButton(
                  onPressed: () {
                    final selfDescribingJson = SelfDescribingJson(
                      schema: 'iglu:com.acme/event/jsonschema/1-0-0',
                      payload: <String, Object>{'message': 'hello world'},
                    );
                    final selfDescribing = SelfDescribing(selfDescribingJson);
                    _tracker.track(selfDescribing);
                  },
                  child: Text('Send Self Describing Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final structured = Structured(
                      category: 'shop',
                      action: 'add-to-basket',
                      label: 'Add To Basket',
                      property: 'pcs',
                      value: 2.00,
                    );
                    _tracker.track(structured);
                  },
                  child: Text('Send Structured Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final screenView = ScreenView(
                      name: 'home',
                      type: 'full',
                      transitionType: 'none',
                      previousName: '',
                      previousType: '',
                    );
                    _tracker.track(screenView);
                  },
                  child: Text('Send Screen View Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final pageView = PageViewEvent(
                      pageUrl: 'https://www.google.com/',
                      pageTitle: 'Google',
                    );
                    _tracker.track(pageView);
                  },
                  child: Text('Send Page View Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final timing = Timing(
                      category: 'category',
                      variable: 'variable',
                      timing: 1,
                      label: 'label',
                    );
                    _tracker.track(timing);
                  },
                  child: Text('Send Timing Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final item = EcommerceTransactionItem(
                      itemId: 'item_id_1',
                      sku: 'item_sku_1',
                      price: 1.00,
                      quantity: 1,
                      name: 'item_name',
                      category: 'item_category',
                      currency: 'currency',
                    );
                    final ecommerceTransaction = EcommerceTransaction(
                      orderId: '6a8078be',
                      totalValue: 300.00,
                      affiliation: 'my_affiliate',
                      taxValue: 30.00,
                      shipping: 10.00,
                      city: 'Boston',
                      state: 'Massachusetts',
                      country: 'USA',
                      currency: 'USD',
                      items: [item],
                    );
                    _tracker.track(ecommerceTransaction);
                  },
                  child: Text('Send Ecommerce Transaction Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final consentDocuments = [
                      ConsentDocument(
                        documentId: 'doc-id1',
                        documentVersion: '1',
                        documentName: 'doc-name1',
                        documentDescription: 'doc-description1',
                      ),
                    ];
                    final consentGranted = ConsentGranted(
                      documentId: '1234',
                      documentVersion: '5',
                      expiry: 'Monday, 19-Aug-05 15:52:01 UTC',
                      documentName: 'Consent document',
                      documentDescription: 'An example description',
                      consentDocuments: consentDocuments,
                    );
                    _tracker.track(consentGranted);
                  },
                  child: Text('Send Consent Granted Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final consentDocuments = [
                      ConsentDocument(
                        documentId: 'doc-id1',
                        documentVersion: '1',
                        documentName: 'doc-name1',
                        documentDescription: 'doc-description1',
                      ),
                    ];
                    final consentWithdrawn = ConsentWithdrawn(
                      all: false,
                      documentId: '1234',
                      documentVersion: '5',
                      documentName: 'Consent document',
                      documentDescription: 'An example description',
                      consentDocuments: consentDocuments,
                    );
                    _tracker.track(consentWithdrawn);
                  },
                  child: Text('Send Consent Withdrawn Event'),
                ),
                SizedBox(height: 24.0),
                ElevatedButton(
                  onPressed: () {
                    final notificationContent = NotificationContent(
                      title: 'You received a new message',
                      body: 'You received a new message',
                      badge: 1,
                    );
                    final pushNotification = PushNotification(
                      action: 'Message Received',
                      deliveryDate: DateTime.now().toString(),
                      trigger: 'message_received',
                      categoryIdentifier: '1',
                      threadIdentifier: '1',
                      notificationContent: notificationContent,
                    );
                    _tracker.track(pushNotification);
                  },
                  child: Text('Send Push Notification Event'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter数据分析跟踪插件snowplow_flutter_tracker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据分析跟踪插件snowplow_flutter_tracker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 snowplow_flutter_tracker 插件进行数据分析跟踪的代码示例。这个插件允许你在 Flutter 应用中集成 Snowplow,以便跟踪用户行为和其他相关数据。

首先,你需要在你的 Flutter 项目中添加 snowplow_flutter_tracker 依赖。打开你的 pubspec.yaml 文件,并添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  snowplow_flutter_tracker: ^最新版本号  # 替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,你需要初始化 Snowplow Tracker 并在你的应用中发送事件。以下是一个简单的示例:

1. 初始化 Snowplow Tracker

在你的应用的主文件(通常是 main.dart)中,初始化 Snowplow Tracker:

import 'package:flutter/material.dart';
import 'package:snowplow_flutter_tracker/snowplow_flutter_tracker.dart';

void main() {
  // 初始化 Snowplow Tracker
  configureSnowplow();
  runApp(MyApp());
}

void configureSnowplow() {
  // 配置 Snowplow Tracker
  SnowplowFlutterTracker.configure(
    endpoint: 'https://<your-collector-endpoint>',  // 替换为你的 Snowplow Collector 端点
    namespace: 'com.example.myapp',
    appId: 'MyApp',
    platform: 'flutter',
    enableFallback: true,
    method: 'post',
    flushBufferSize: 10,
    flushInterval: 60,
  );

  // 启动 Snowplow Tracker
  SnowplowFlutterTracker.start();
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

2. 发送事件

在你的应用中的其他地方,你可以发送各种事件。例如,在一个按钮点击事件中:

import 'package:flutter/material.dart';
import 'package:snowplow_flutter_tracker/snowplow_flutter_tracker.dart';

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Snowplow Flutter Tracker Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 发送自定义事件
            SnowplowFlutterTracker.trackSelfDescribingEvent(
              schema: 'iglu:com.snowplowanalytics.snowplow/page_view/jsonschema/1-0-0',
              data: {
                'pageId': 'home_screen',
                'pageTitle': 'Home Screen',
                'referrer': 'unknown',
              },
            );
          },
          child: Text('Track Page View'),
        ),
      ),
    );
  }
}

3. 处理屏幕视图

如果你希望自动跟踪屏幕视图,你可以使用 ScreenViewTracker。以下是如何集成 ScreenViewTracker 的示例:

import 'package:flutter/material.dart';
import 'package:snowplow_flutter_tracker/snowplow_flutter_tracker.dart';

void main() {
  configureSnowplow();
  runApp(MyApp());
}

void configureSnowplow() {
  SnowplowFlutterTracker.configure(
    endpoint: 'https://<your-collector-endpoint>',  // 替换为你的 Snowplow Collector 端点
    namespace: 'com.example.myapp',
    appId: 'MyApp',
    platform: 'flutter',
    enableFallback: true,
    method: 'post',
    flushBufferSize: 10,
    flushInterval: 60,
  );

  // 启动 Snowplow Tracker
  SnowplowFlutterTracker.start();

  // 初始化屏幕视图跟踪器
  ScreenViewTracker.startTracking(
    tracker: SnowplowFlutterTracker.instance,
    onScreenView: (routeName) {
      // 可选:自定义屏幕视图事件数据
      Map<String, dynamic> context = {
        'screen_name': routeName,
      };
      SnowplowFlutterTracker.trackSelfDescribingEvent(
        schema: 'iglu:com.snowplowanalytics.snowplow/screen_view/jsonschema/1-0-0',
        data: context,
      );
    },
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: (settings) {
        // 处理路由,返回带有路由名称的 Widget
        switch (settings.name) {
          case '/':
            return MaterialPageRoute(builder: (context) => HomeScreen());
          // 添加其他路由
          default:
            return MaterialPageRoute(builder: (context) => Scaffold(body: Center(child: Text('404'))));
        }
      },
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Snowplow Flutter Tracker Example'),
      ),
      body: Center(
        child: Text('Home Screen'),
      ),
    );
  }
}

在这个示例中,ScreenViewTracker 会自动跟踪路由变化,并在每次路由变化时发送一个屏幕视图事件。

这些代码示例展示了如何在 Flutter 应用中集成和使用 snowplow_flutter_tracker 插件进行数据分析跟踪。根据你的需求,你可以进一步定制和扩展这些示例。

回到顶部