实现单聊消息收发
更新时间: 2024/11/21 17:18:38
网易云信 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 大步骤。
sequenceDiagram
note over NIM SDK: 步骤1:集成SDK
note over NIM SDK: 步骤2:初始化SDK
发送方 ->> NIM SDK: 初始化SDK
接收方 ->> NIM SDK: 初始化SDK
note over NIM SDK: 步骤3:登录 IM
发送方 ->> NIM SDK: 登录IM服务端
接收方 ->> NIM SDK: 监听消息接收回调
接收方 ->> NIM SDK: 登录IM服务端
note over NIM SDK: 步骤4:消息收发
发送方 ->> NIM SDK: 构建文本消息
发送方 ->> NIM SDK: 发送文本消息给用户B
NIM SDK ->> 接收方: 投递消息
步骤1:集成 SDK
NIM Flutter SDK 已经发布到 pub 库,您可以通过配置 pubspec.yaml
自动下载更新。
-
在项目的
pubspec.yaml
文件中添加以下依赖。dependencies: nim_core: ^1.1.0
-
通过 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 会自动同步消息和系统通知等数据。同步完成则登录流程结束。
-
发送方和接收方注册登录相关监听,包括登录状态监听、数据同步监听和多端登录监听。
示例代码如下:
注册登录状态监听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();
注册多端登录监听dart
final 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();
-
接收方注册消息接收事件流(
onMessage
),监听消息接收。示例代码如下:
NimCore.instance.messageService.onMessage.listen((List<NIMMessage> list) { // 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。 });
-
发送方和接收方调用
login
方法手动登录云信 IM 服务端。-
登录信息(
NIMLoginInfo
)必传参数说明NIMLoginInfo 参数 是否必传 说明 account
是 云信 IM 帐号,即 accid
token
是 登录需要用到的令牌,即 token
-
示例代码
dart
NimCore.instance.authService .login(NIMLoginInfo(account: 'account', token: 'token',)) .then( (result) { if (result.isSuccess) { /// 登录成功 } else { /// 登录失败 } }, );
更多登录相关说明,请参见登录登出。
-
步骤4:实现消息收发
本节介绍如何通过 SDK API 实现单聊场景的文本消息收发。其他类型消息收发相关 SDK API 的介绍,包括图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息,请参见MessageService
。
-
消息发送方调用
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));
-
消息接收事件流触发回调,接收方收到消息。
后续步骤
为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的 IM 账号(测试用),请确保在后续的正式生产环境中,将其替换为通过 IM 服务端 API 生成的正式 IM 账号。