Flutter友盟统计插件fl_umeng的使用

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

Flutter友盟统计插件 fl_umeng 的使用

友盟统计插件 fl_umeng 用于在Flutter应用中集成友盟统计功能。以下是如何使用该插件的详细步骤和示例代码。

前置条件

  • 友盟APM性能监测如需直接使用,请参考fl_umeng_apm
  • 友盟超链请参考fl_umeng_link
  • 以上均基于 fl_umeng,必须初始化友盟 FlUMeng().init()

Android 配置

/android/app/build.gradle 文件中添加混淆配置:

android {
    buildTypes {
        release {
            // 添加混淆配置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'consumer-rules.pro'
        }
        debug {
            // 添加混淆配置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'consumer-rules.pro'
        }
    }
}

开始使用

注册友盟

首先需要注册友盟并进行初始化:

Future<void> init() async {
  /// 注册友盟 统计 性能检测 
  final bool? data = await FlUMeng().init(
      androidAppKey: '5f8fe2abfac90f1c19a8642e',
      iosAppKey: '5f8fe4d4c1122b44acfc7aa7',
      channel: 'channel');
  print('UMeng 初始化成功 = $data');
}

设置用户账号

可以设置或取消用户的账号信息:

void fun() {
  /// 是否开启log 仅支持 Android
  FlUMeng().setLogEnabled(true);

  /// 设置用户账号
  FlUMeng().signIn('userID');

  /// 取消用户账号
  FlUMeng().signOff();
}

发送自定义事件

发送自定义事件(目前属性值支持字符、整数、浮点、长整数,暂不支持NULL、布尔、MAP、数组):

void fun() {
  FlUMeng().onEvent('test', <String, String>{'test': 'test'});
}

页面统计

可以设置页面统计模式,并记录页面进入和离开的时间:

void fun() {
  /// 设置是否自动采集;
  FlUMeng().setPageCollectionMode(true);

  /// 进入页面统计 
  FlUMeng().onPageStart('pageName');

  /// 离开页面统计
  FlUMeng().onPageEnd('pageName');
}

错误发送

仅支持Android平台的错误发送:

void fun() {
  /// 错误发送  仅支持 Android
  FlUMeng().reportError('error');
}

完整示例 Demo

以下是一个完整的示例,展示了如何在Flutter应用中使用 fl_umeng 插件:

import 'package:fl_umeng/fl_umeng.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'UMeng Example',
      home: Scaffold(
          appBar: AppBar(title: const Text('UMeng Example')),
          body: SafeArea(
            child: Container(
                width: double.infinity,
                padding: const EdgeInsets.symmetric(horizontal: 10),
                child: _HomePage()),
          ))));
}

class _HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<_HomePage> {
  String text = '';

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

  /// 注册友盟
  Future<void> init() async {
    debugPrint('注册友盟');
    final bool data = await FlUMeng().init(
        androidAppKey: '5f8fe2abfac90f1c19a8642e',
        iosAppKey: '5f8fe4d4c1122b44acfc7aa7',
        channel: 'channel');
    debugPrint('Umeng 初始化成功 = $data');
    await FlUMeng().setLogEnabled(true);
  }

  @override
  Widget build(BuildContext context) {
    return Column(children: [
      Container(
          margin: const EdgeInsets.symmetric(vertical: 10),
          width: double.infinity,
          height: 130,
          padding: const EdgeInsets.all(10),
          alignment: Alignment.center,
          decoration: BoxDecoration(
              color: Colors.black12, borderRadius: BorderRadius.circular(6)),
          child: SingleChildScrollView(
              child: Text(text, textAlign: TextAlign.center))),
      Expanded(
          child: SingleChildScrollView(
              child: Wrap(
                  spacing: 5,
                  runSpacing: 5,
                  alignment: WrapAlignment.center,
                  children: buildVoid))),
    ]);
  }

  List<Widget> get buildVoid => [
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng().signIn('userId');
              text = 'signIn  $data';
              setState(() {});
            },
            child: const Text('signIn')),
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng().signOff();
              text = 'signOff  $data';
              setState(() {});
            },
            child: const Text('signOff')),
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng().onPageStart('pageStart');
              text = 'onPageStart  $data';
              setState(() {});
            },
            child: const Text('onPageStart')),
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng().onPageEnd('pageEnd');
              text = 'onPageEnd  $data';
              setState(() {});
            },
            child: const Text('onPageEnd')),
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng()
                  .onEvent('test', <String, String>{'test': 'test'});
              text = 'onEvent  $data';
              setState(() {});
            },
            child: const Text('onEvent')),
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng().setPageCollectionMode(true);
              text = 'setPageCollectionMode  $data';
              setState(() {});
            },
            child: const Text('setPageCollectionMode')),
        ElevatedButton(
            onPressed: () async {
              final bool data = await FlUMeng().setLogEnabled(true);
              text = 'logEnabled  $data';
              setState(() {});
            },
            child: const Text('logEnabled')),
        if (defaultTargetPlatform == TargetPlatform.android)
          ElevatedButton(
              onPressed: () async {
                final bool data = await FlUMeng().reportError('error');
                text = 'reportError  $data';
                setState(() {});
              },
              child: const Text('reportError (仅支持 Android)'))
      ];
}

这个示例展示了如何在Flutter应用中集成友盟统计插件 fl_umeng,包括初始化、用户登录/登出、发送自定义事件、页面统计以及错误报告等功能。希望对您有所帮助!


更多关于Flutter友盟统计插件fl_umeng的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter友盟统计插件fl_umeng的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用fl_umeng插件进行友盟统计的示例代码。请注意,实际使用时,你需要根据具体的友盟后台配置和项目需求进行调整。

1. 添加依赖

首先,在你的Flutter项目的pubspec.yaml文件中添加fl_umeng依赖:

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

然后运行flutter pub get来安装依赖。

2. 配置Android

修改android/app/src/main/AndroidManifest.xml

AndroidManifest.xml中添加友盟统计所需的权限和配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 其他配置 -->

    <!-- 友盟统计权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <!-- 友盟统计Application配置 -->
    <application
        android:name=".MyApplication"  <!-- 确保这里引用了自定义的Application类 -->
        ... >

        <!-- 友盟统计Service配置 -->
        <service
            android:name="com.taobao.android.umeng.appanalyze.AppMonitorService"
            android:exported="true"
            android:process=":remote" />
        <receiver android:name="com.taobao.android.umeng.appanalyze.AppMonitorReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>

    </application>
</manifest>

创建自定义Application类

android/app/src/main/kotlin/com/example/yourapp/(或Java目录)下创建MyApplication.kt(或MyApplication.java):

Kotlin:

package com.example.yourapp

import android.app.Application
import com.taobao.android.umeng.common.UMConfigure

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        
        // 初始化友盟统计
        UMConfigure.init(this, "你的友盟AppKey", "Channel", UMConfigure.DEVICE_TYPE_PHONE, null)
    }
}

Java:

package com.example.yourapp;

import android.app.Application;
import com.taobao.android.umeng.common.UMConfigure;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        
        // 初始化友盟统计
        UMConfigure.init(this, "你的友盟AppKey", "Channel", UMConfigure.DEVICE_TYPE_PHONE, null);
    }
}

3. 配置iOS

ios/Runner/Info.plist中添加配置

如果你需要iOS统计,需要在Info.plist中添加友盟所需的配置,但通常友盟iOS统计需要更多的配置和代码,这里仅展示基础的配置方式,具体请参考友盟官方文档。

配置iOS AppDelegate

ios/Runner/AppDelegate.swift(或AppDelegate.m)中添加友盟统计的初始化代码:

Swift:

import UIKit
import Flutter
import fl_umeng  // 导入fl_umeng插件

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    
    // 初始化友盟统计(需要确保fl_umeng插件支持iOS)
    // 通常这一步由fl_umeng插件自动处理,但具体初始化代码可能需要参考插件文档
    // 例如:UMConfigure.init(appKey: "你的友盟AppKey", channel: "Channel")
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

注意:由于Flutter插件的封装,通常不需要手动在iOS代码中调用友盟的初始化方法,这些通常由插件自动处理。但请确保你查阅了fl_umeng插件的文档,以确认是否需要额外的iOS配置。

4. 在Flutter中使用友盟统计

在你的Flutter代码中,你可以使用fl_umeng插件提供的API进行事件统计等操作。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 友盟统计示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 自定义事件统计
              FlUmeng.onEvent(eventId: "custom_event_id", attributes: {
                "key1": "value1",
                "key2": "value2",
              });
            },
            child: Text('发送自定义事件'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,并在按钮点击时发送一个自定义事件到友盟统计。

注意事项

  1. 确保友盟AppKey正确:在初始化友盟统计时,确保你使用的AppKey是从友盟后台获取的,并且是正确的。
  2. 平台特定配置:对于iOS和Android平台,可能需要额外的配置,具体请参考友盟官方文档和fl_umeng插件的文档。
  3. 隐私政策:在使用统计功能时,请确保你的应用有合适的隐私政策,并告知用户将收集哪些数据以及如何使用这些数据。

希望这个示例能帮助你成功地在Flutter项目中使用fl_umeng插件进行友盟统计。

回到顶部