Flutter

实现单聊消息收发

更新时间: 2024/06/19 13:44:59

网易云信 IM 即时通讯服务基于网易多年的通信服务技术积累,致力于打造最稳定的即时通讯平台。NetEase Instant Messaging Flutter SDK (以下简称为 NIM Flutter SDK)为 Flutter 应用提供完善的即时通信功能开发框架,屏蔽其内部复杂细节,对外提供较为简洁的 API 接口,方便第三方应用快速集成即时通信功能。

NIM Flutter SDK 目前支持 Android 和 iOS。非移动端(包括 Windows、macOS 和 Web)仍为 Beta 版本,处于内测阶段,敬请期待。

本文介绍如何通过较少的代码集成 NIM Flutter SDK 并调用 API,在您的应用中实现文本消息收发。

前提条件

  • 已在云信控制台创建应用,获取 App Key。

  • 注册云信 IM 账号,获取 accid 和 token。

  • 已准备如下开发环境/工具:

    • Flutter-dart 2.17.0 及以上版本。

    • 各端开发环境要求:

      Android
      • Android Studio 3.5 及以上版本。
      • App 要求 Android 5.0 API 19 及以上版本设备。
      • 1.5.21以上版本的 kotlin-gradle-plugin
      iOS
      • Xcode 11.0 及以上版本。
      • App 要求 iOS 11.0 以上版本设备。
      • 项目已设置有效的开发者签名。

      Windows、macOS 和 Web 目前仍为 Beta 版本,处于内测阶段,敬请期待。

实现流程

流程概览

实现消息收发的流程可分为如下图所示的 4 大步骤。下图可能因网络问题显示异常,一般通过刷新页面即可正常显示。

uml diagram

步骤1:集成 SDK

NIM Flutter SDK 已经发布到 pub 库,您可以通过配置 pubspec.yaml 自动下载更新。

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

    dependencies: 
    nim_core: ^1.1.0 
    
  2. 通过 Shell 或者 IDE 执行以下命令,下载依赖包。

    flutter pub get
    

集成 SDK 之后,Android 端 还需进行编译与防混淆配置(其他端不需要),详情参见编译与防混淆配置

步骤2:初始化

调用initialize方法初始化 SDK。

初始化必须在应用的生命周期内进行,且只可进行一次。

  • 参数说明

    参数 类型 说明
    context Context 应用上下文
    options NIMSDKOptions 初始化配置信息,可为空。不传时会使用默认配置。
  • 示例代码

    dart
    final NIMSDKOptions options;
    if (Platform.isAndroid) {
    options = NIMAndroidSDKOptions(
        appKey: 'appkey',
        /// 其他 通用/Android 配置
    );
    } else if (Platform.isIOS) {
    options = NIMIOSSDKOptions(
        appKey: 'appkey',
        /// 其他通用配置/iOS 配置
    );
    } else if (KisWeb) {
        options = NIMSDKOptions(
        appKey: 'appKey',
        /// 其他基础通用配置参数    
        )
    }
    NimCore.instance.initialize(options)
        .then((result){
            if (result.isSuccess) {
                /// 初始化成功
            } else {
                /// 初始化失败
            }
        });
    
    

步骤3:登录 IM 服务端

实现消息收发前,需要先建立 SDK 与 IM 服务端的连接,登录 IM 服务端。登录成功后,SDK 会自动同步消息和系统通知等数据。同步完成则登录流程结束。

  1. 发送方和接收方注册登录相关监听,包括登录状态监听、数据同步监听和多端登录监听。

    示例代码如下:

    注册登录状态监听
    dart
        /// 开始监听事件
        final subscription = NimCore.instance.authService.authStatus.listen((event) {
        if (event is NIMKickOutByOtherClientEvent) {
            /// 监听到被踢事件
        } else if (event is NIMAuthStatusEvent) {
            /// 监听到其他事件
        }
        });
    
        /// 不再监听时,需要取消监听,否则造成内存泄漏
        /// subscription.cancel();
    
    
    注册数据同步监听
    dart
    /// 开始监听事件
    final subscription = NimCore.instance.authService.authStatus.listen((event) {
    if (event is NIMDataSyncStatusEvent) {
        /// 监听到数据同步事件
        if (event.status == NIMAuthStatus.dataSyncStart) {
        /// 数据同步开始
        } else if (event.status == NIMAuthStatus.dataSyncFinish) {
        /// 数据同步完成
        }
    }
    });
    
    /// 不再监听时,需要取消监听,否则造成内存泄漏
    /// subscription.cancel();
    
    注册多端登录监听
    dartfinal subscription = NimCore.instance.authService.onlineClients.listen((clients) {
    clients.forEach((client) {
        switch (client.clientType) {
        case NIMClientType.windows:
            // PC端
            break;
        case NIMClientType.macos:
            // MAC端
            break;
        case NIMClientType.web:
            // Web端
            break;
        case NIMClientType.ios:
            // IOS端
            break;
        case NIMClientType.android:
            // Android端
            break;
        default:
            // 未知
            break;
        }
    });
    });
    
    /// 不再监听时,需要取消监听,否则造成内存泄漏
    /// subscription.cancel();
    
  2. 接收方注册消息接收事件流(onMessage),监听消息接收。

    示例代码如下:

    NimCore.instance.messageService.onMessage.listen((List<NIMMessage> list) {
        // 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。
    });
    
    
  3. 发送方和接收方调用login方法手动登录云信 IM 服务端。

    • 登录信息(NIMLoginInfo)必传参数说明

      NIMLoginInfo 参数 是否必传 说明
      account 云信 IM 帐号,即 accid
      token 登录需要用到的令牌,即 token
    • 示例代码

      dartNimCore.instance.authService
          .login(NIMLoginInfo(account: 'account', token: 'token',))
          .then(
          (result) {
              if (result.isSuccess) {
              /// 登录成功
              } else {
              /// 登录失败
              }
          },
          );
      

    更多登录相关说明,请参见登录登出

步骤4:实现消息收发

本节介绍如何通过 SDK API 实现单聊场景的文本消息收发。其他类型消息收发相关 SDK API 的介绍,包括图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息,请参见MessageService

  1. 消息发送方调用createTextMessage方法构建文本消息,然后调用sendMessage方法发送该消息。

    示例代码如下:

    // 该帐号为示例
    String account = 'testAccount';
    // 以单聊类型为例
    NIMSessionType sessionType = NIMSessionType.p2p;
    String text = 'this is an example';
    // 创建并且发送一个文本消息
    Future<NIMResult<NIMMessage>> result = MessageBuilder.createTextMessage(
        sessionId: account, sessionType: sessionType, text: text)
        .then((value) => value.isSuccess
        ? NimCore.instance.messageService
            .sendMessage(message: value.data!, resend: false)
        : Future.value(value));
    
  2. 消息接收事件流触发回调,接收方收到消息。

后续步骤

为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的 IM 账号(测试用),请确保在后续的正式生产环境中,将其替换为通过 IM 服务端 API 生成的正式 IM 账号。

此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 实现流程
  • 流程概览
  • 步骤1:集成 SDK
  • 步骤2:初始化
  • 步骤3:登录 IM 服务端
  • 步骤4:实现消息收发
  • 后续步骤