Flutter自定义客户端信息获取插件custom_client_information的使用

Flutter自定义客户端信息获取插件custom_client_information的使用

客户端信息

这是一个允许你从应用程序客户端获取基本信息的插件。它易于使用,并支持不同的平台(Android、iOS 和 Web)。有四种不同类型的信息:“应用信息”、“软件信息”、“操作系统信息”和“设备信息”。

Pub License: MIT

iOS 截图

Android 截图

Web 截图

信息类型

有四种不同类型的客户端信息:

  1. 应用信息
  2. 软件信息
  3. 操作系统信息
  4. 设备信息

应用信息

应用信息包括构建的应用程序的所有信息。请注意,applicationId 对于 Web 应用程序不支持。

属性 iOS Android Web
applicationId
字符串
✔ bundleIdentifier ✔ 包名 ✘ 默认为应用名称
applicationType
字符串 (app/web)
applicationName
字符串
applicationVersion
字符串
applicationBuildCode
字符串

软件信息

“软件”指的是运行你的应用程序的软件,例如 iOS/Android 项目的“操作系统”或 Web 项目的“浏览器”。

属性 iOS Android Web
softwareName
字符串
✔ 操作系统名称 ✔ 操作系统名称 ✔ 浏览器名称
softwareVersion
字符串
✔ 操作系统版本 ✔ 操作系统版本 ✔ 浏览器版本

操作系统信息

操作系统信息将显示操作系统的名称和版本。注意:如果浏览器的用户代理不包含任何关于操作系统的信息,Web 项目可能无法获取这些信息。

属性 iOS Android Web
osName
字符串
✔ 操作系统名称 ✔ 操作系统名称 ⚠️ 操作系统名称(可能未知)
osVersion
字符串
✔ 操作系统版本 ✔ 操作系统版本 ⚠️ 操作系统版本(可能未知)
osVersionCode
字符串
✔ iOS 版本(数字) ✔ Android API 级别 ⚠️ 操作系统版本(数字)(可能未知:-1)

设备信息

设备信息将显示设备的 ID 和名称。请注意,Web 项目不支持真实的 deviceId,因此它们会使用包 uuid 生成一个唯一的字符串并保存到浏览器的 Cookie 中。

属性 iOS Android Web
deviceId
字符串
deviceName
字符串
✘ 默认为操作系统名称/浏览器名称(例如 iOS 14 / Chrome 88.0)

开始使用

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

dependencies:
  ...
  custom_client_information: ^2.1.2

在你的项目中添加以下导入:

import 'package:custom_client_information/custom_client_information.dart';

然后,你可以像这样获取信息:

// 获取客户端信息
ClientInformation info = await ClientInformation.fetch();

print(info.deviceId); // EA625164-4XXX-XXXX-XXXXXXXXXXXX
print(info.osName); // iOS

装饰

从版本 2.1.0 开始,你可以通过传递 decorators 来自定义某些信息。如下所示:

var information = await ClientInformation.fetch(
      // 你可以传递装饰器来装饰返回值之前的信息。
      decorators: ClientInformationDecorators(
        deviceId: (oriInfo, value) => 'prefix-$value-${oriInfo.applicationName}',
      ),
    );

或者,你可以使用扩展方法,如下所示:

var information = await ClientInformation.fetch();
print('Original DeviceId: ${information.deviceId}');
// Original DeviceId: EA625164-4XXX-XXXX-XXXXXXXXXXXX

var decoratedInfo = information.decoration(deviceId: (oriInfo, value) => '$value-some-suffix-string-here');
print('Decorated DeviceId: ${decoratedInfo.deviceId}');
// Decorated DeviceId: EA625164-4XXX-XXXX-XXXXXXXXXXXX-some-suffix-string-here

测试时的模拟数据

从版本 1.0.2 开始,你可以模拟数据或启用“模拟模式”以方便测试。以下是设置方法:

在你的测试文件中:

setUp(() async {
  // 更改为“模拟模式”并设置你需要的默认数据。
  ClientInformation.mockOn(
      deviceId: 'mock_device_id', osName: 'MyCustomOS');
});

tearDown(() {
  // 在 `tearDown` 方法中关闭“模拟模式”
  ClientInformation.mockOff();
});

// 运行你的测试
test('`deviceId` 将是 `mock_device_id`', () async {
  ClientInformation info = await ClientInformation.fetch();
  expect(info.deviceId, 'mock_device_id');
});

示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ClientInformation? basicInfo, decoratedInfo;

  [@override](/user/override)
  void initState() {
    super.initState();
    _fetchInfo();
  }

  void _fetchInfo() async {
    basicInfo = await ClientInformation.fetch();

    decoratedInfo = await ClientInformation.fetch(
      decorators: ClientInformationDecorators(
        deviceId: (oriInfo, value) => 'prefix-$value-${oriInfo.applicationName}',
      ),
    );

    ///! 或者,你可以使用扩展方法,如下所示:
    // decoratedInfo = (await ClientInformation.fetch()).decoration(
    //     deviceId: (oriInfo, value) => 'prefix-$value-${oriInfo.applicationName}');
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        centerTitle: true,
        title: const Text('Client Information Example'),
      ),
      body: LayoutBuilder(builder: (context, _) {
        return Column(
          children: [
            Expanded(
              child: SingleChildScrollView(
                child: basicInfo == null || decoratedInfo == null
                    ? _buildLoading()
                    : _buildInfoView(),
              ),
            ),
          ],
        );
      }),
    );
  }

  Widget _buildLoading() {
    return const Center(child: CircularProgressIndicator());
  }

  Widget _buildInfoView() {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        _dataItemWidget('deviceId', basicInfo?.deviceId ?? 'unknown_device_id'),
        _dataItemWidget('decorated deviceId', decoratedInfo?.deviceId ?? 'unknown_decorated_device_id'),
        _dataItemWidget('deviceName', basicInfo?.deviceName ?? 'unknown_device_name'),
        _dataItemWidget('osName', basicInfo?.osName ?? 'unknown_os_name'),
        _dataItemWidget('osVersion', basicInfo?.osVersion ?? 'unknown_os_version'),
        _dataItemWidget('osVersionCode', basicInfo?.osVersionCode.toString() ?? 'unknown_os_version_code'),
        _dataItemWidget('softwareName', basicInfo?.softwareName ?? 'unknown_software_name'),
        _dataItemWidget('softwareVersion', basicInfo?.softwareVersion ?? 'unknown_software_version'),
        _dataItemWidget('applicationId', basicInfo?.applicationId ?? 'unknown_application_id'),
        _dataItemWidget('applicationType', basicInfo?.applicationType ?? 'unknown_application_type'),
        _dataItemWidget('applicationName', basicInfo?.applicationName ?? 'unknown_application_name'),
        _dataItemWidget('applicationVersion', basicInfo?.applicationVersion ?? 'unknown_application_version'),
        _dataItemWidget('applicationBuildCode', basicInfo?.applicationBuildCode ?? 'unknown_application_build_number'),
      ],
    );
  }

  Widget _dataItemWidget(String key, String? value) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6),
      child: Wrap(
        children: [
          Text('$key: ', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
          Text(value ?? 'null', style: const TextStyle(fontSize: 18, color: Colors.blueAccent)),
        ],
      ),
    );
  }
}

更多关于Flutter自定义客户端信息获取插件custom_client_information的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义客户端信息获取插件custom_client_information的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


custom_client_information 是一个 Flutter 插件,用于获取客户端(即设备)的详细信息。这个插件可以帮助你获取设备的唯一标识符、操作系统版本、设备型号等信息。以下是如何使用 custom_client_information 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 custom_client_information 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  custom_client_information: ^0.0.1 # 请确保使用最新的版本号

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

2. 导入插件

在你需要使用的地方导入 custom_client_information 插件:

import 'package:custom_client_information/custom_client_information.dart';

3. 获取客户端信息

你可以使用 CustomClientInformation 类来获取客户端信息。以下是一个示例:

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

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

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

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

class _HomeScreenState extends State<HomeScreen> {
  String _deviceId = 'Unknown';
  String _osVersion = 'Unknown';
  String _deviceModel = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    _getClientInformation();
  }

  Future<void> _getClientInformation() async {
    CustomClientInformation clientInfo = CustomClientInformation();

    String deviceId = await clientInfo.deviceId;
    String osVersion = await clientInfo.osVersion;
    String deviceModel = await clientInfo.deviceModel;

    setState(() {
      _deviceId = deviceId;
      _osVersion = osVersion;
      _deviceModel = deviceModel;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Client Information'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Device ID: $_deviceId'),
            Text('OS Version: $_osVersion'),
            Text('Device Model: $_deviceModel'),
          ],
        ),
      ),
    );
  }
}
回到顶部