Flutter感知功能插件percept_flutter的使用

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

Flutter感知功能插件percept_flutter的使用

引言

本文档将详细介绍如何使用Percept Flutter SDK。

开始使用

1. 安装

  1. 在你的项目 pubspec.yaml 文件中添加以下依赖项:

    dependencies:
        percept_flutter: ^5.0.2
    
  2. 使用以下命令安装包:

    $ flutter pub get
    
  3. 在你的Dart代码中导入该包以供使用:

    import 'package:percept_flutter/percept_flutter.dart';
    

2. 初始化Percept SDK

import 'package:percept_flutter/percept_flutter.dart';

class YourClassState extends State<YourClass> {
  Percept percept;

  @override
  void initState() {
    super.initState();
    percept = Percept(token);
  }
}

Percept 构造函数接受一些可选参数,如下所示:

参数名 描述 默认值
autoCaptureAppLifecycleEvents 是否自动捕获应用生命周期事件 true
autoCaptureUnhandledErrors 是否自动捕获未处理的错误 true
maxBatchSize 事件请求的默认批次大小 100
maxDelayMins 失败时重试请求的最大间隔时间 30分钟
maxCacheSizeMb 存储失败请求的最大缓存大小 10MB
clearAfterDays 重新尝试失败后存储的失败请求在多少天后被删除 7天
enableExperiment 启用或禁用服务中的实验功能 false
experimentFetchedCb 当获取到实验数据时触发的回调函数 undefined
experimentRefetchIntervalMin 指定在多少分钟内重新获取实验数据 undefined
int maxBatchSize = 100,
int maxDelayMins = 30,
int maxCacheSizeMb = 10,
int clearAfterDays = 7

注意: token 是与您的应用关联的Percept工作区令牌。

3. 设置用户

成功初始化SDK后,在登录时使用以下函数设置当前用户:

percept.setUser(
  userId: "userId",
  userProperties: {UserProperty.name: "TestUser"},
  additionalProperties: {"isVerifiedAccount": true}
);

4. 设置当前用户属性

使用 setCurrentUserProperties 方法来设置由 setUser 创建的用户配置文件上的属性:

// 首先调用此方法
await percept.setUser(userId: 'U1');

// 设置用户 `deviceToken` 和 `isPaidUser` 属性为true
percept.setCurrentUserProperties(
  userProperties: {UserProperty.deviceToken: "token"},
  additionalProperties: {"isPaidUser": true}
);

用户属性只能包含在 UserProperty 枚举中的键,如下所示:

用户属性名称 描述
userId 与用户关联的用户ID
name 用户姓名
phone 与用户关联的电话号码
email 与用户关联的电子邮件ID
deviceToken 设备的FCM令牌

注意: 要获取您的Firebase令牌,可以使用:

FirebaseMessaging.instance.getToken()

FirebaseMessaging.instance.onTokenRefresh.listen((token) => { });

5. 互动

与Firebase Messaging集成:以简化推送通知功能并准确监控其对归因的影响
  1. 捕获当应用程序从终止状态通过交互推送通知启动会话时的事件。
// 获取导致应用程序从终止状态打开的任何消息。
RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();
if (initialMessage != null) {
  _percept.trackPNTerminated(initialMessage.toMap());
}
  1. 捕获当应用程序从后台状态通过交互推送通知恢复会话时的事件。
// 获取导致应用程序从终止状态打开的任何消息。
FirebaseMessaging.onMessageOpenedApp.listen(
  (message) => _percept.trackPNBackground(message.toMap()),
);
  1. 捕获当应用程序处于前台状态并且接收到推送通知时的事件。
// 获取当应用程序处于前台时接收到的任何消息。
FirebaseMessaging.onMessage.listen(
  (message) => _percept.trackPNForeground(message.toMap()),
);
  1. 通知SDK在终止状态下接收通知以便更好地归因

在调用 runApp 之前注册处理器。有关后台FCM消息处理的详细信息,请参阅 https://firebase.google.com/docs/cloud-messaging/flutter/receive#background_messages

import 'package:percept_flutter/constants.dart';
import 'package:percept_flutter/utils/comm_helpers.dart';

@pragma('vm:entry-point')
Future<void> bgMessageHandler(RemoteMessage message) async {
  CapturePerceptCommRequest(
    PerceptCommunicationState.received, 
    message.toMap(), 
    PERCEPT_TEST_KEY
  );
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultOptions.currentPlatform);
  FirebaseMessaging.onBackgroundMessage(bgMessageHandler);
  runApp(MyApp());
}

此属性将在每个随后跟踪的事件中通过 pi_pn_attribution 属性进行跟踪。

pi_pn_attribution 描述
terminated 与pn的交互从终止状态启动了当前应用程序会话
background 与pn的交互从后台状态恢复了当前应用程序会话
foreground 通知是在应用程序处于前台状态时接收到的
none 当前会话不归因于任何pn

除了 pi_pn_attribution 属性外,还会跟踪以下属性:

Property_name 描述
pi_pn_targetUrl 通知负载中的目标URL
pi_pn_campaignId 与通知关联的活动ID
pi_pn_campaignName 与通知关联的活动名称
pi_pn_campaignSource 与通知关联的活动来源

注意: 必须实现Firebase Messaging才能启用这些属性的支持。

6. 发送事件

您可以使用以下函数捕获事件。Percept会自动生成一个唯一的ID,并将其存储在本地存储或cookie中。

// 仅跟踪事件名称
percept.capture('Referral Banner Click');

// 跟踪带有属性的事件名称
percept.capture('Screen View', {'screenName': 'Homepage'});

// 跟踪已处理的错误
percept.captureError(error, stackTrace);

在初始化库后,Percept将自动跟踪一些默认属性。

7. 设置全局属性

设置全局属性,这些属性将与所有后续事件一起传递:

percept.setGlobalProperties({'global-property-key', 'value'});

8. 获取所有全局属性

获取所有全局属性:

percept.getGlobalProperties();

9. 清除

在注销时调用清除函数以删除所有与用户相关的数据:

percept.clear();

SDK自动跟踪的事件

事件名称 控制参数 描述
App Opened autoCaptureAppLifecycleEvents 当Percept SDK初始化时触发
App Active autoCaptureAppLifecycleEvents 当应用程序进入前台时触发
App Backgrounded autoCaptureAppLifecycleEvents 当应用程序进入后台时触发
App Session autoCaptureAppLifecycleEvents 当应用程序会话完成时触发
App Installed autoCaptureAppLifecycleEvents 当应用程序首次安装时触发
App Updated autoCaptureAppLifecycleEvents 当应用程序更新时触发

SDK跟踪的属性

属性名称 描述
pi_app_name 应用程序名称
pi_app_version 类似 “2.3.7” 的友好应用程序版本
pi_app_build 类似 “2.3.7” 或 “237” 的构建号
pi_os_name 类似iOS或Android的操作系统名称
pi_os_version 操作系统版本 “7.1.3”
pi_sdk_type PI SDK类型,如Flutter或Native
pi_sdk_version PI SDK版本
pi_pn_attribution 如果当前会话归因于PN交互,则进行跟踪

除了其他平台特定的设备信息外,还包括:

IOS:

属性名称 描述
pi_systemName 当前操作系统的名称
pi_systemVersion 当前操作系统版本
pi_model 设备型号
pi_isPhysicalDevice 如果应用程序在模拟器中运行则为false,否则为true

Android:

属性名称 描述
pi_brand 产品/硬件将与其关联的消费者可见品牌
pi_device 工业设计的名称
pi_hardware 硬件名称(来自内核命令行或/proc)
pi_manufacturer 产品的制造商/硬件
pi_model 最终用户的可见名称
pi_product 整个产品的名称
pi_isPhysicalDevice 如果应用程序在模拟器中运行则为false,否则为true
pi_systemFeatures 描述当前设备上可用的功能

处理实验

1. 启用实验

要启用实验跟踪,将 enableExperiment 选项设置为 trueinitOptions 中。您还可以指定一个回调函数以在获取到实验数据时处理数据。

final initOptions = InitOptions(
  enableExperiment: true,
  experimentFetchedCb: (data) {
    final experimentData = data['experimentData'];
    final experimentUserType = data['experimentUserType'];
    final isExperimentDataResolved = data['isExperimentDataResolved'];

    if (isExperimentDataResolved) {
      print('Experiment data fetched: $experimentData');
    } else {
      print('Experiment data could not be resolved.');
    }
  },
  experimentRefetchIntervalMin: 10, // 每10分钟重新获取一次实验数据
);

Percept('Your Project Token', initOptions);

注意: experimentRefetchIntervalMin 选项设置了自动重新获取实验数据的时间间隔(分钟)。间隔必须至少为5分钟。如果提供了小于5的值,它将自动设置为5分钟,并记录警告。

2. 获取实验数据

您可以随时使用 getExperiment 方法获取实验数据。此方法返回一个Future,解析为指定实验的变体数据。

final experimentName = 'example-experiment';
final variant = await percept.getExperiment(experimentName);

if (variant) {
  print('User is in variant: $variant');
} else {
  print('No variant data available');
}

3. 重新获取实验数据

如果您设置了 experimentRefetchIntervalMs 选项,SDK将在指定的时间间隔内自动重新获取实验数据。您也可以使用 refetchExperiment 方法手动重新获取实验数据。

await percept.refetchExperiment();

4. 获取所有活动的实验

您可以使用 getAllActiveExperiments 方法获取所有活动的实验及其变体。

final activeExperiments = await percept.getAllActiveExperiments();
print('Active experiments:', activeExperiments);

5. 获取实验用户类型

您可以使用 getExperimentUserType 方法获取实验的用户类型。

final userType = await percept.getExperimentUserType();
print('Experiment user type:', userType);

更多关于Flutter感知功能插件percept_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter感知功能插件percept_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用percept_flutter插件的一个示例。percept_flutter插件通常用于设备感知功能,比如光线传感器、加速度计等。不过,请注意,实际功能可能会根据插件的版本和设备的支持情况有所不同。

首先,确保你的Flutter环境已经设置好,并且已经创建了一个新的Flutter项目。

1. 添加依赖

pubspec.yaml文件中添加percept_flutter依赖:

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

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

2. 导入插件

在你需要使用感知功能的Dart文件中导入插件:

import 'package:percept_flutter/percept_flutter.dart';

3. 使用光线传感器示例

以下是一个使用光线传感器的简单示例:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  double? lightLevel;

  @override
  void initState() {
    super.initState();
    _listenToLightSensor();
  }

  void _listenToLightSensor() async {
    final lightSensor = LightSensor();

    lightSensor.stream.listen((event) {
      setState(() {
        lightLevel = event.lux;
      });
    }, onError: (error) {
      print('Error listening to light sensor: $error');
    });

    // Optional: Check initial light level
    final initialLightLevel = await lightSensor.checkLightLevel();
    setState(() {
      lightLevel = initialLightLevel?.lux;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Light Sensor Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Light Level: ${lightLevel ?? 'Unknown'} lux',
                style: TextStyle(fontSize: 24),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 使用加速度计示例

以下是一个使用加速度计的简单示例:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late AccelerometerEvent? _lastAccelerometerEvent;

  @override
  void initState() {
    super.initState();
    _listenToAccelerometer();
  }

  void _listenToAccelerometer() {
    final accelerometer = Accelerometer();

    accelerometer.stream.listen((event) {
      setState(() {
        _lastAccelerometerEvent = event;
      });
    }, onError: (error) {
      print('Error listening to accelerometer: $error');
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Accelerometer Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'X: ${_lastAccelerometerEvent?.x ?? '0.0'}\nX: ${_lastAccelerometerEvent?.y ?? '0.0'}\nX: ${_lastAccelerometerEvent?.z ?? '0.0'}',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  • 确保设备支持所需的传感器。
  • 在实际使用中,可能需要处理更多的边缘情况和错误处理。
  • 根据插件的更新情况,API可能会有所变化,请参考最新的插件文档。

这些代码示例展示了如何在Flutter应用中使用percept_flutter插件来访问光线传感器和加速度计的数据。根据你的具体需求,你可以进一步扩展这些示例。

回到顶部