当前位置: 首页 > news >正文

鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版

融云完成针对“纯血鸿蒙”操作系统的 SDK 研发,HarmonyOS NEXT 版融云 IM SDK 已上线,开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。

发挥 20 年通信行业技术积累和领创品牌效应,融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业的“纯血鸿蒙”原生应用开发与适配方案。

  • 提供单聊、群聊、聊天室等功能,支持文字、图片、语音等多类型消息,具备自定义功能及完整的会话管理能力。
  • 适配鸿蒙系统的 Framework,支持 ArkTS 语言;
  • 遵循鸿蒙系统 API 提供 Promise 接口,方便调用;
  • 支持真机与模拟器测试运行,开发者可根据情况选择使用,更全面地测试和优化应用;
  • 支持鸿蒙推送,全平台覆盖保障成功率。

根据以下教程,您可以体验集成融云鸿蒙 IM SDK 的基本流程和 IMLib 的基础通信能力。

前置条件

注册开发者账号。注册成功后,控制台会默认自动创建您的首个应用,默认生成开发环境下的 App Key,使用国内数据中心。

获取开发环境的应用 App Key。如不使用默认应用,请参考 如何创建应用,并获取对应环境 App Key 和 App Secret。

创建鸿蒙应用

编译环境

DevEco Studio 版本号:DevEco Studio NEXT Developer Beta1 5.0.3.403

手机系统版本号:NEXT.0.0.26

设备要求

真机华为 Mate 系列。真机运行需要配置证书,详情参考鸿蒙的签名指南文档。

模拟器。详情参考鸿蒙的模拟器运行指南文档。

开始集成

自动导入 SDK

  1. 在 DevEco Studio 中,点击左侧边栏的 Partner SDK。
    在这里插入图片描述
  2. 选择 社交 或者 Social networking, 您可以看到 融云 IMLib SDK ,然后点击 Install 来安装融云 IMLib SDK。
    在这里插入图片描述
  3. 安装 SDK 成功后,您可以在项目根目录的 oh_modules/.ohpm/ 中找到融云 IMLib SDK。

添加 SDK 依赖权限

需要添加如下权限:
ohos.permission.GET_NETWORK_INFO
ohos.permission.INTERNET
ohos.permission.STORE_PERSISTENT_DATA
详情请参考鸿蒙应用权限配置文档。

初始化 SDK

融云即时通讯客户端 SDK 核心类为 IMEngine 在 UIAbility 的 onCreate() 方法中,调用初始化方法,传入生产或开发环境的 App Key。

// 在 UIAbility 中获取 context
let context = this.contextlet initOption = new InitOption();
let appKey = "从融云后台获取的 appKey";
IMEngine.getInstance().init(context, appKey, initOption);

初始化配置 InitOption 中封装了区域码 AreaCode,导航服务地址 naviServer ,统计服务地址 statisticServer ,文件下载路径 mediaSavePath

SDK 默认连接北京数据中心

如果 App Key 不属于中国(北京)数据中心,则必须传入有效的初始化配置。初始化详细说明参见初始化

获取用户 Token

用户 Token 是与用户 ID 对应的身份验证令牌,是应用程序的用户在融云的唯一身份标识。应用客户端在使用融云即时通讯功能前必须与融云建立 IM 连接,连接时必须传入 Token。

在实际业务运行过程中,应用客户端需要通过应用的服务端调用 IM Server API 申请取得 Token。详见 Server API 文档 注册用户。

在本教程中,为了快速体验和测试 SDK,我们将使用控制台「北极星」开发者工具箱,从 API 调试页面调用 获取 Token 接口,获取到 userId 为 1 的用户的 Token。提交后,可在返回正文中取得 Token 字符串。

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8{"code":200,"userId":"1","token":"gxld6GHx3t1eDxof1qtxxYrQcjkbhl1V@sgyu.cn.example.com;sgyu.cn.example.com"}

建立 IM 连接

  1. 监听 IM 连接状态的变化,以便 UI 上给用户以提示,提高体验。
hilog.info(0x0000, 'IM-App', 'setConnectionStatusListener');
IMEngine.getInstance().setConnectionStatusListener((status: ConnectionStatus) => {hilog.info(0x0000, 'IM-App', 'setConnectionStatusListener onChanged status:%{public}d', status);
});
  1. 使用以上步骤中获取的 Token, 模拟 userId 为 1 的用户连接到融云服务器。
let token = "IMToken";
let timeout = 5;hilog.info(0x0000, 'IM-App', 'connect token:%{public}s', token);
IMEngine.getInstance().connect(token, timeout).then(result => {hilog.info(0x0000, 'IM-App', 'connect result :%{public}s', JSON.stringify(result));});

SDK 已实现自动重连机制,请参见连接。

监听消息

设置消息接收监听器,用于接收所有类型的实时或者离线消息。

hilog.info(0x0000, 'IM-App', 'setMessageReceivedListener start');
IMEngine.getInstance().setMessageReceivedListener((message: Message, info: ReceivedInfo) => {//  针对接收离线消息时,服务端会将 200 条消息打成一个包发到客户端,客户端对这包数据进行解析。该参数表示每个数据包数据逐条上抛后,还剩余的条数let left = info.left;// 消息是否离线消息let isOffline = info.isOffline;// 是否在服务端还存在未下发的消息包let hasPackage = info.hasPackage;
});

发送消息

向 userId 为 2 的用户发送一条消息。

// 创建会话标识
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "2"; // 按需填写实际的会话 id// 创建文本消息
let textMsg = new TextMessage();
textMsg.content = "from 鸿蒙 ";
textMsg.extra = "TestExtra";let option: ISendMsgOption = {};// 创建消息体
let msg = new Message(conId, textMsg);// 发送消息
hilog.info(0x0000, 'IM-App', 'SendTextMessage start');
IMEngine.getInstance().sendMessage(msg,option,(msg: Message) => {// 消息入库回调hilog.info(0x0000, 'IM-App', 'SendTextMessage onSave msg:%{public}s', JSON.stringify(msg));
}).then(result => {// 消息发送结果hilog.info(0x0000, 'IM-App', 'SendTextMessage onResult :%{public}s', JSON.stringify(result));
})

相关文章:

鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版

融云完成针对“纯血鸿蒙”操作系统的 SDK 研发,HarmonyOS NEXT 版融云 IM SDK 已上线,开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。 发挥 20 年通信行业技术积累和领创品牌效应,融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业…...

【全国大学生电子设计竞赛】2022年D题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~...

【优秀python案例】基于python爬虫的深圳房价数据分析与可视化实现

现如今,房价问题一直处于风口浪尖,房价的上涨抑或下跌都牵动着整个社会的利益,即便是政府出台各种政策方针也只能是暂时抑制楼市的涨势,对于需要买房的人来说,除了关注这些变化和政策外,还有一个非常头疼的…...

vscode安装与配置本地c/c++编译调试环境

目录 (1)安装vscode和常用插件 1.下载安装vscode 2.安装常用插件 (2)本地安装和配置编译器 1.安装编译器 2.vscode配置编译器 第1种:全局配置 第2种:为当前项目个性化配置 (3&#xff…...

PCIe学习笔记(15)

设备就绪状态 (Device Readiness Status,DRS)消息 (Device Readiness Status (DRS) 是PCIe规范中引入的一种机制,旨在改进设备初始化和就绪状态的检测与报告。 在以往的PCIe版本中,系统通常依赖于固定的超时机制来判断设备是否已…...

Rust中的特殊类型所占的内存大小

可以使用std::mem:size_of获取类型大小&#xff1a; use std::mem::size_of;struct Journal(String, u32); trait Summary {} impl Summary for Journal {}fn main() {println!("普通结构体相关&#xff1a;");println!("{}", size_of::<&Journal&…...

【深度学习】变分自编码器 VAE,什么是变分?(1)

文章目录 1. 变分自编码器 VAEVAE的基本概念VAE的数学原理编码器解码器目标函数训练过程代码示例未来发展2. 变分推断变分推断(Variational Inference)变分推断的基本概念变分推断的目标变分下界(Evidence Lower Bound, ELBO)最大化变分下界变分推断的步骤3. 必读内容1. 变…...

宏编程:C++宏、Rust宏和Lisp宏比较

根据simondobson两篇文章&#xff08;1、2&#xff09;&#xff0c;总结比较一下C宏 Rust宏和Lisp宏&#xff1a; Rust 宏&#xff1a;Rust 有两种类型的宏&#xff1a; 声明性宏&#xff1a;这些模式匹配参数来生成代码。 过程宏&#xff1a;这些宏执行从代码到代码的更一般…...

ChatGPT协助撰写研究论文的11种方法【全集】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时&#xff0c;原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享&#xff0c;我们将谈谈 ChatGPT 在研究论文方面可…...

PEP 8 – Python 代码风格指南中文版(四)

何时使用尾随逗号 尾随逗号通常是可选的&#xff0c;但在创建一个只有一个元素的元组时是必须的。为了清晰起见&#xff0c;建议使用&#xff08;技术上多余的&#xff09;括号将其包围起来&#xff1a; # 正确的: FILES (setup.cfg,)# 错误的: FILES setup.cfg, 当尾随逗号…...

基于深度学习的适应硬件的神经网络

基于深度学习的适应硬件的神经网络设计旨在最大限度地利用特定硬件平台的计算和存储能力&#xff0c;提高模型的执行效率和性能。这些硬件包括图形处理单元&#xff08;GPU&#xff09;、张量处理单元&#xff08;TPU&#xff09;、现场可编程门阵列&#xff08;FPGA&#xff0…...

上传音频文件

思路 1、自定义Upload 重点&#xff1a;<input ref{inputRef} type"file" accept{accept} onClick{e > e.stopPropagation()} onChange{uploadFile} multiple{multiple}/> 使用input标签设置type是file&#xff0c;将input元素通过forwardRef暴露给父组件&…...

Linux之jdk离线安装

下载地址 一、linux安装jdk8 1、上传&#xff0c;解压 cd /usr/local/java tar -zxvf jdk-10.0.2_linux-x64_bin.tar.gz2、修改配置 vim /etc/profile #在/etc/profile文件后面加上如下配置 export JAVA_HOME/usr/local/java/jdk-10.0.2 export JRE_HOME/usr/local/java/jd…...

JVM结构、架构与生命周期总结

【1】JVM结构 不同厂商的JVM产品 &#xff1a; 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天&#xff0c;Java程序的运行性能早已脱胎换骨&#xff0c;已…...

Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)

文章目录 前言2.3.3 管理分区2.3.3.1 增加分区2.3.3.2 删除分区2.3.3.3 恢复分区2.3.3.4 查看分区 2.3.4 设置分桶2.3.4.1 随机分桶&#xff08;自 v3.1&#xff09;2.3.4.2 哈希分桶2.3.4.2.1 优点2.3.4.2.2 如何选择分桶键2.3.4.2.3 注意事项 2.3.4.3 确定分桶数量 2.3.5 最佳…...

为什么有时候银行贷款审核会查大数据信用?

在申请银行贷款时&#xff0c;不少人会疑惑为何银行会深入审查申请人的大数据信用信息。这背后&#xff0c;其实是银行风险控制与精准决策的体现。 首先&#xff0c;大数据信用信用能全面反映申请人的信用状况 它不仅仅局限于传统的征信报告&#xff0c;还涵盖了消费行为、社交…...

LoRa无线通讯,让光伏机器人实现无“线”管理

光伏清洁机器人&#xff0c;作为光伏电站运维的新兴关键设备&#xff0c;已跃升为继组件、支架、光伏逆变器之后的第四大核心组件&#xff0c;正逐步成为光伏电站的标准配置。鉴于光伏电站普遍坐落于偏远无人区或地形复杂之地&#xff0c;光伏清洁机器人必须具备远程操控能力、…...

买流量卡要注意什么,这些冷知识你一定要懂!

买流量卡要注意什么&#xff1f;别总盯着价格看&#xff0c;还有一些隐形的冷知识得了解一下&#xff0c;今天这篇文章就是要告诉你一些流量卡中隐藏的冷知识。 ​一、首先&#xff0c;那些月租9元、19元的流量卡&#xff0c;大概率都是短期卡&#xff0c;虽然他们的资费便宜&a…...

【嵌入式】STM3212864点阵屏使用SimpleGUI单色屏接口库——(2)精简字库

一 开源库简介与移植 最近一个项目需要用12864屏幕呈现一组较为复杂的菜单界面&#xff0c;本着不重复造轮子的原则找到了SimpleGUI开源库。 开源地址&#xff1a;SimpleGUI: 一个面向单色显示屏的开源GUI接口库。 SimpleGUI是一款针对单色显示屏设计的接口库。相比于传统的GUI…...

《计算机网络》(第8版)第1章 概述 复习笔记

第 1 章 概述 一、计算机网络在信息时代中的作用 计算机网络的两个重要功能&#xff1a; 1 &#xff0e;连通性 指互联网上的用户之间是相互连通的。 2 &#xff0e;共享&#xff08;资源共享&#xff09; 资源共享可以是信息共享、软件共享&#xff0c;也可以是硬件共享。此…...

银行数据质量保障体系建设实践

引言 在数字化转型浪潮中&#xff0c;数据中台成为企业实现数据驱动决策的关键支撑。它不仅整合了企业内外部的数据资源&#xff0c;还通过数据共享与复用&#xff0c;提升了运营效率和业务创新能力。然而&#xff0c;随着数据量的激增和数据来源的多样化&#xff0c;如何确保…...

笔记小结:《利用Python进行数据分析》二进制数据格式存储与web交互

提示&#xff1a;此节内容仅作了解即可 目录 二进制数据格式 使用HDF5 读取Microsoft Excel文件 二进制数据格式 实现数据的高效二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。 Python 的 pickle 模块是一个用于序列化和反序列化 Python 对象结构的模块…...

电脑桌面图标变白了?3个方法20秒钟轻松解

电脑桌面图标变白了&#xff1f;3个方法20秒钟轻松解 ⚠️电脑桌面图标变白了&#xff0c;3种方法轻松解决 &#x1f6b8;方法一和方法二属于治标不治本的解决方法&#xff0c;但操作较为简单&#xff0c;在不同情况下有不成功的可能&#xff0c;方法三相对复杂一些&#xff0c…...

数据治理,管什么?

元数据&#xff08;Metadata&#xff09;&#xff1a;通俗地说就是描述数据的数据&#xff0c;比如数据的名称、属性、分类、字段信息、大小、标签等等。要做好数据的管理&#xff0c;元数据起到了举足轻重的作用。 参考数据&#xff08;Reference Data&#xff09;&#xff1…...

【前端】JavaScript入门及实战121-125

文章目录 121 滚轮事件122 键盘事件123 键盘移动div124 BOM125 History 121 滚轮事件 <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <style type"text/css">#box1 {width: 100px;h…...

pytest测试框架之http协议接口测试

1 接口测试 日常测试中接口测试是一项重要的工作&#xff0c;尤其是http协议的接口测试更加普遍,比如一些常用的测试框架或者工具&#xff08;robotframework框架&#xff0c;testng框架&#xff0c;postman等&#xff09;都支持http接口的测试&#xff0c;而这节内容主要介绍…...

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…...

springboot物流寄查系统-计算机毕业设计源码95192

目 录 1 绪论 1.1 研究背景 1.2选题背景 1.3论文结构与章节安排 2 springboot物流寄查系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2…...

【秋招笔试】24-07-27-OPPO-秋招笔试题(算法岗)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 第一题贪心模拟…...

AUTOSAR实战教程 - 模式管理BswM与其他各模块的交互

近日驻厂某OEM,幸得大块的个人时间, 把BswM这一块的内容从ETAS/ISOLAR工具配置到代码实现做了一个全方位的CT. 2024,希望孜孜内卷的汽车人升职加薪! 博主近期写的一首小诗,也一并送给大家,懂的都懂: 在看不到阳光的冬天/ 我染了风寒/ 白天点灯/ 晚上吃药/ 躺在被窝里才敢…...

wordpress option/东莞seo网站排名优化

项目简述&#xff1a;基于开源Hadoop2.0架构的集群网络&#xff0c;进行海量数据的分布式计算。由于Hadoop集群规模不断扩大&#xff0c;而搭建一个同等规模的测试集群需要一笔昂贵的开销。目前有100台左右物料&#xff0c;期望预测计算节点1500的集群网络性能&#xff0c;目前…...

高端大气的公司名称/seo关键词排名如何

死锁&#xff1a;在多线程程序中&#xff0c;同步时可能需要多个锁&#xff0c;如果获得锁的顺序不一致&#xff0c;可能会导致死锁&#xff0c;死锁不一定会出现。 如何避免死锁&#xff1f; 答&#xff1a; 当需要获得多个锁时&#xff0c;所有线程获得锁的顺序保持一致即可…...

做网站的法律/手机网站建设

一&#xff0c;类继承 1.1&#xff0c;C函数库的缺点 除非厂商提供了库函数的源码&#xff0c;否则无法根据自己的需求对库函数进行修改。 1.2&#xff0c;使用类继承带来的优点 面向对象编程的主要目的之一是提供可重用的代码&#xff0c;类继承提供了比修改源码更好的方法&…...

学校网站建设的申请/南昌企业网站建设

基于SSMMavenBootStrapMySQL的在线商城系统[实战视频]—304人已学习 课程介绍 本课程基于MavenSpringSpringMVCMyBatisMySQLBootStrap技术&#xff0c;使用IntelliJ IDEA开发工具。 主要是锻炼SSM技术的运用&#xff0c;通过项目实战&#xff0c;加强对框架技术的理解和运用…...

59网站一起做网店广州/在线建站网页制作网站建设平台

SimpleDateFormat转24小时类型时间字符串&#xff1a;yyyy-MM-dd HH:mm:ss...

秀屿区建设局网站/怎么做一个网页

分页原理&#xff1a; 1、设置setOnScrollListener监听滑动到底部 // 设置listview的滚动监听// 设置分页lv.setOnScrollListener(new AbsListView.OnScrollListener() {Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {switch (scrollState) …...