Flutter即时通讯插件echat_platform_flutter_sdk的使用

Flutter即时通讯插件echat_platform_flutter_sdk的使用

一洽专业在线客服系统,可通过网站、微信、APP、小程序、微博、Facebook、Line、WhatsApp、邮件、贴子等任意渠道接入。系统智能支持:多样式选择、多路由接入、多业务整合、多角色监控、多维度分析,多平台统一管理。

SDK 简介

一洽 echat_platform_flutter_sdk 插件,封装了Android & iOS原生SDK常用API,使用该插件,无须调用原生API即可使用一洽服务。

集成文档

完整文档请参考:Flutter 插件集成文档

1. 集成Flutter插件

在 Flutter 项目的 pubspec.yaml 文件中 dependencies 里面添加 echat_platform_flutter_sdk 依赖。

dependencies:
  # 添加一洽SDK插件
  echat_platform_flutter_sdk: ^[version]

执行 flutter pub get 命令安装插件。

flutter pub get

注意:Android需要手动添加一洽maven服务器地址,否则会出现打包Android失败的情况

在 Flutter 项目的 android/build.gradle

allprojects {
    repositories {
        // 保留官方仓库地址
        google()
        mavenCentral()
        // 添加一洽maven服务器地址
        maven { url "https://nexus.rainbowred.com/repository/sdk/" }
    }
}

2. 配置权限

2.1 Android 权限配置

在 Flutter 项目,打开 <code>android/app/src/main/AndroidManifest.xml</code>,将下面权限添加到 <manifest></manifest> 之间。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>

<!-- Android 13 要求 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

<!-- Android 14 要求 -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" /> 
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />

若当前android项目的targetSdkVersion较低,可能打包出现AndroidManifest.xml merge合并错误,请根据情况删除对应的权限。

若使用的 flutter sdk3.12.0 - 3.19.6 时,则需要适配Android 13要求。

若使用的 flutter sdk 版本大于等于 3.22.0 时,则需要适配Android13 与 Android 14要求。

2.2 Android 14 依赖适配

考虑到版本适配性,若使用的 flutter sdk 版本大于等于 3.22.0 (Android targetSDK大于34时),需要在android中引入一个依赖库。文件目录为 <code>根目录/android/app/build.gradle</code>,找到 <code>dependencies</code>,添加 <code>implementation("com.echatsoft.echatsdk.platform:android14:1.0.0.0")</code>

dependencies {
  implementation("com.echatsoft.echatsdk.platform:android14:1.0.0.0")
}
2.3 Android 混淆配置

在 Flutter 项目,打开 <code>android/app/proguard-rules.pro</code>,将SDK混淆配置追加到该文件内容之后。

# EChat SDK混淆配置
-dontwarn com.echatsoft.**
-keep class com.echatsoft.** { *; }
-keep class org.cometd.** { *; }
-keep class org.eclipse.** { *; }

# EChat SDK 默认使用的图片加载库混淆配置
-keep class com.bumptech.glide.** { *; }
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule { *; }

如果当前的混淆设置能够保证应用在发布(release)模式下正常运行,那么您不需要参照完整的混淆配置方案进行设置。

对于那些尚未设置任何混淆规则的项目,您可以采用以下提供的完整混淆配置指导进行配置。请参考完整的混淆配置指南

2.4 iOS 权限配置

打开iOS项目中的podfile文件.添加如下代码至文件末尾

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
            config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
            config.build_settings['ENABLE_BITCODE'] = 'NO'
            config.build_settings["ONLY_ACTIVE_ARCH"] = "NO"
        end
    target.build_configurations.each do |config|
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
            '$(inherited)',
            'PERMISSION_MICROPHONE=1',
            'PERMISSION_CAMERA=1',
            'PERMISSION_PHOTOS=1',
          ]
        end
  end
end

3. 配置参数

3.1 调试开关

如需查看SDK打印日志,请将以下配置项设置为true

非必要无须配置,配置请放在 <code>配置参数</code>/<code>初始化</code> 之前

EChatFlutterSdk.setDebug(debug: true);
3.2 SDK配置参数

关于配置参数,请联系技术支持获取,请勿随意配置参数。

参数 类型 作用 必须
appId String SDK初始化参数
appSecret String SDK初始化参数
serverAppId String SDK初始化参数
serverEncodingKey String SDK加密参数
serverToken String SDK加密参数
companyId int 公司/平台id
isAgreePrivacy bool 客户是否已经同意隐私协议
serverUrl String 服务器地址,非必要误填

配置参数必须在Flutter启动时,第一时间设置,兼容了隐私合规。

  • 首次App启动,此时客户还未同意隐私协议,设置setConfig,isAgreePrivacy = false
  • 用户同意隐私协议后,每次App启动,都需要设置setConfig,且isAgreePrivacy = true
EChatFlutterSdk.setConfig(
    appId: 'SDKCV5XSSVPFGSKXXXX',
    appSecret: "CTBMXIKRDRYTFQVRZQ3ZJAPIMN2QVK62D53MBGXXXX",
    serverAppId: "8546F8346D6BB48840B763000231XXXX",
    serverEncodingKey: "7k263sdcmyvEY3OZjAsZ4RONB4zaZgOZEgEKntEXXXX",
    serverToken: "2fr6XXXX",
    companyId: 5230XX,
    isAgreePrivacy: isAgreePrivacy,
);

注意:原生SDK没有专门用于配置参数的接口,是在初始化时进行配置参数。若选择Flutter端配置参数,就不需要再原生端调用任何与初始化有关的API。

4. 初始化

EChatFlutterSdk.init();

注意:若App有合规需求,可以参考 隐私合规

5. 对话窗口

5.1 打开对话窗口

接口参数:

参数 类型 作用 必须
companyId int 公司id
echatTag String 对话入口标识
myData String 会员补充信息
routeEntranceId String 咨询入口
visEvt EchatVisEvtModel 图文消息
acdStaffId String 指派接待客服的ID
acdType String 分配优先级,0-优先,1-指派
fm EchatFMModel 接入对话带入访客消息

仅打开对话

EChatFlutterSdk.openChat(companyId: xxx);

示例代码

import 'dart:convert';

import 'package:echat_platform_flutter_sdk/echat_flutter_sdk.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:shared_preferences/shared_preferences.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

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

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
  late Future<bool> _isAgreePrivacy;
  int _unreadCount = 0;
  String _content = "";

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

    // 一洽SDK初始化
    _initEChatSDK();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('EChat FlutterSDK example app'),
      ),
      body: Center(
        child: FutureBuilder<bool>(
            future: _isAgreePrivacy,
            builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
              if (snapshot.hasData && snapshot.data!) {
                return _sdkFuncMenus();
              } else {
                return const Text("未同意隐私协议");
              }
            }),
      ),
    );
  }

  Widget _sdkFuncMenus() {
    return Column(
      children: [
        const SizedBox(height: 8),
        ElevatedButton(
          onPressed: () {
            openChat();
          },
          child: const Text("打开聊天窗口 - 全功能"),
        ),
        const SizedBox(height: 8),
        ElevatedButton(
          onPressed: () {
            openBox();
          },
          child: const Text("打开消息盒子 - echatTag: flutter"),
        ),
        const SizedBox(height: 8),
        ElevatedButton(
          onPressed: () {
            setUserInfo();
          },
          child: const Text("设置会员接口"),
        ),
        const SizedBox(height: 8),
        ElevatedButton(
          onPressed: () {
            clearUserInfo();
          },
          child: const Text("清理会员"),
        ),
        ElevatedButton(
          onPressed: () {
            getUserInfo();
          },
          child: const Text("获取会员信息"),
        ),
        ElevatedButton(
          onPressed: () {
            closeConnection();
          },
          child: const Text("关闭链接"),
        ),
        ElevatedButton(
          onPressed: () {
            closeAllChats();
          },
          child: const Text("关闭所有对话"),
        ),
        // 动态消息展示
        const SizedBox(height: 8),
        Text("未读消息条数: $_unreadCount"),
        const SizedBox(height: 8),
        Expanded(
          child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 16),
            child: Text(_content),
          ),
        ),
      ],
    );
  }

  /// SDK初始化
  void _initEChatSDK() async {
    // 打印调试信息
    EChatFlutterSdk.setDebug(debug: true);

    // 获得隐私协议是否同意数据
    _isAgreePrivacy = _prefs.then((SharedPreferences prefs) {
      return prefs.getBool("isAgreePrivacy") ?? false;
    });

    // 是否同意隐私协议 不影响设置参数
    // 不会影响合规性
    // 设置默认sdk参数
    final isAgreePrivacy = await _isAgreePrivacy;
    EChatFlutterSdk.setConfig(
      appId: 'SDKCV5XSSVPFGSK5N6U',
      appSecret: "CTBMXIKRDRYTFQVRZQ3ZJAPIMN2QVK62D53MBGCXBJE",
      serverAppId: "8546F8346D6BB48840B763000231F1A1",
      serverEncodingKey: "7k263sdcmyvEY3OZjAsZ4RONB4zaZgOZEgEKntEbYNn",
      serverToken: "2fr6R3jL",
      companyId: 523055,
      isAgreePrivacy: isAgreePrivacy,
    );

    if (isAgreePrivacy) {
      // 已经同意隐私协议
      EChatFlutterSdk.init();
      // 已经同意隐私协议 才调用pushInfo接口
      var result = await EChatFlutterSdk.setPushInfo(pushInfo: 'XXXXXXXXXXXXXXXXXXXXXXXXX');
      print(result ? "设置pushInfo成功" : "设置pushInfo失败");
    } else {
      // 未同意隐私协议
      // 弹出一个dialog窗口
      // 提示用户同意隐私协议
      // 用户点击同意后 调用EChatFlutterSdk.init();
      _showPrivacyPolicyDialog();
    }
    registerUnreadCount();
  }

  /// 显示隐私协议弹窗
  /// 用户点击同意后 调用EChatFlutterSdk.init();
  /// 用户点击不同意后 关闭弹窗
  void _showPrivacyPolicyDialog() {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text("隐私协议"),
          content: const Text(
              "请您务必审慎阅读、充分理解“隐私协议”各条款,包括但不限于:为了向您提供即时通讯、内容分享等服务,我们需要收集您的设备信息、操作日志等个人信息。您可以在“设置”中查看、变更、删除个人信息并管理您的授权。您可阅读《隐私协议》了解详细信息。如您同意,请点击“同意”开始接受我们的服务。"),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: const Text("不同意"),
            ),
            TextButton(
              onPressed: () async {
                Navigator.of(context).pop();
                // 同意隐私协议
                final SharedPreferences prefs = await _prefs;
                setState(() {
                  _isAgreePrivacy = prefs
                      .setBool("isAgreePrivacy", true)
                      .then((bool success) {
                    return success;
                  });
                });
                EChatFlutterSdk.init();
              },
              child: const Text("同意"),
            ),
          ],
        );
      },
    );
  }

  ///打开对话
  void openChat() async {
    var visEvt = EchatVisEvtModel(
      eventId: "cook1002",
      title: "西西里#韩国秋冬百搭纯色V领衬衫 ",
      content: "<div style='color:#666;line-height:20px'>原价:<span style='text-decoration:line-through'>¥185.50</span></div><div style='color:#666;line-height:20px'>促销:<span style='color:red'>¥104.70</span></div><div style='color:#666;line-height:20px'>运费:<span style='color:#ccc'>卖家承担运费</span></div>",
      imageUrl: "https://demo.echatsoft.com/web/html/demoMall/url/visitorUrl/myproduct/images/2.jpg",
      urlForVisitor: "http('https://demo.echatsoft.com/web/html/demoMall/url/staffUrl/myproduct/?eventId=cook1002','inner')",
      urlForStaff: "apiUrl(123,'hash')",
      memo: "评价(4000)",
    );
    await EChatFlutterSdk.openChat(
        companyId: 523055,
        visEvt: visEvt,
        echatTag: "flutter",
        myData: "flutter-myData",
        fm: EchatFMModel.createTextMessage(content: "这是Fm功能"));
  }

  //打开消息盒子
  void openBox() async {
    await EChatFlutterSdk.openBox(echatTag: "flutter");
  }

  ///设置会员
  void setUserInfo() async {
    var userInfo = EchatUserInfo(
      uid: "flutter_demo_1",
      name: "Flutter飞",
      nickName: "Flutter🅱️",
      gender: 2,
      age: 30,
      grade: "3",
      category: "金牌会员",
      birthday: "1990-01-01",
      maritalStatus : 2,
      phone: "13888888888",
      wechat: "xubbb",
      email: "xubbb3212@qq.com",
      nation: "中国",
      province: "广东",
      city: "深圳市",
      address: "广东省深圳市南山区粤海街道100号",
      photo: "https://vfile.rainbowred.com/group1/M00/A9/69/wKhCBGMiglSAaHezAAARhGlFe90967.jpg",
      memo: "高价值会员",
      c1: "c1 - test"
    );
    await EChatFlutterSdk.setUserInfo(userInfo);
  }

  ///会员信息获得
  void getUserInfo() async {
    var userInfo = await EChatFlutterSdk.getUserInfo();
    print('Type is ${userInfo.runtimeType}');
    print('info -> ${userInfo?.toMap()}');
  }

  ///清理会员
  void clearUserInfo() async {
    // 模拟logout
    //1.先关闭所有对话
    closeAllChats();

    //2.再清理会员信息
    await EChatFlutterSdk.clearUserInfo();
  }

  /// 测试未读和未读消息数
  void registerUnreadCount() {
    EChatFlutterSdk.getUnreadMsgCount((count) {
      print("未读消息数目: $count");
      setState(() {
        _unreadCount = count;
      });
    });
  }

  /// 关闭链接
  void closeConnection() async {
    final result = await EChatFlutterSdk.closeConnection();
    print(result ? "关闭通信成功" : "关闭通信失败");
    setState(() {
      _content = result ? "关闭通信成功" : "关闭通信失败";
    });
  }

  void closeAllChats() async {
    bool result = await EChatFlutterSdk.closeAllChats();
    print(result ? "关闭全部对话成功" : "关闭全部对话失败");
    setState(() {
      _content = result ? "关闭全部对话成功" : "关闭全部对话失败";
    });
  }
}

更多关于Flutter即时通讯插件echat_platform_flutter_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter即时通讯插件echat_platform_flutter_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


echat_platform_flutter_sdk 是一个为 Flutter 应用程序设计的即时通讯(IM)插件,它允许开发者轻松地在应用中集成即时通讯功能。以下是如何使用 echat_platform_flutter_sdk 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  echat_platform_flutter_sdk: ^1.0.0  # 请根据实际情况使用最新版本

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

2. 初始化 SDK

在使用 SDK 之前,你需要在应用程序启动时初始化它。通常,你可以在 main.dart 文件中进行初始化:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SDK
  await EchatPlatformFlutterSdk.init(
    appKey: 'YOUR_APP_KEY',  // 替换为你的 App Key
    appSecret: 'YOUR_APP_SECRET',  // 替换为你的 App Secret
  );

  runApp(MyApp());
}

3. 用户登录

在用户登录时,你需要调用 SDK 的登录方法。通常,你会在用户登录成功后调用此方法:

import 'package:echat_platform_flutter_sdk/echat_platform_flutter_sdk.dart';

void loginUser(String userId, String token) async {
  await EchatPlatformFlutterSdk.login(userId: userId, token: token);
}

4. 发送消息

你可以使用 SDK 提供的 API 来发送消息。例如,发送文本消息:

import 'package:echat_platform_flutter_sdk/echat_platform_flutter_sdk.dart';

void sendTextMessage(String targetId, String text) async {
  await EchatPlatformFlutterSdk.sendTextMessage(
    targetId: targetId,
    text: text,
  );
}

5. 接收消息

你可以通过监听事件来接收消息。例如,监听收到新消息的事件:

import 'package:echat_platform_flutter_sdk/echat_platform_flutter_sdk.dart';

void listenForMessages() {
  EchatPlatformFlutterSdk.onMessageReceived.listen((message) {
    print('Received message: ${message.content}');
    // 处理接收到的消息
  });
}

6. 用户登出

在用户登出时,记得调用 SDK 的登出方法:

import 'package:echat_platform_flutter_sdk/echat_platform_flutter_sdk.dart';

void logoutUser() async {
  await EchatPlatformFlutterSdk.logout();
}

7. 其他功能

echat_platform_flutter_sdk 还提供了许多其他功能,例如:

  • 创建群组
  • 加入/退出群组
  • 发送图片、语音、文件等多媒体消息
  • 获取历史消息
  • 设置消息已读状态

你可以参考 SDK 的官方文档来了解更多详细的使用方法。

8. 处理错误

在使用 SDK 时,可能会遇到各种错误。你可以通过捕获异常来处理这些错误:

try {
  await EchatPlatformFlutterSdk.sendTextMessage(
    targetId: targetId,
    text: text,
  );
} catch (e) {
  print('Failed to send message: $e');
}

9. 调试和日志

你可以启用 SDK 的调试模式来查看详细的日志信息:

EchatPlatformFlutterSdk.setDebugMode(true);
回到顶部