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

技术分享| 基于RTM 实现的呼叫邀请如何添加推送功能?

RTM 实时消息服务,解决了在线实时信令的传递,如何配合推送服务,去做离线通知功能一直困扰着开发者,本文从 RTM 的功能以及响应机制入手,教大家如何通过RTM配合第三方推送服务来完成离线消息通知。

RTM 主要功能

  • 点对点消息与频道消息: 向单个或多个用户发送和接收文字、自定义格式等消息或信令类型。
  • 用户属性和频道属性: 对用户属性和频道属性进行增删改查操作,可以实现用户标注、群公告等功能。
  • 频道人数和成员列表: 获取单个或多个频道的成员人数。获取频道内用户列表。
  • 查阅或订阅用户在线状态: 获取或订阅指定用户的在线状态。
  • 呼叫邀请: 发送和接收呼叫邀请。

推送服务集成

为了能够快速实现推送功能,我们用第三方极光推送来完成推送功能。

服务端

极光提供服务端REST API ,为了自身账号的安全,需要服务端去封装该接口,并提供给客户端一个推送的接口服务来完成推送。

服务端提供注册设备的接口,方便其他设备来呼叫该设备的时候,可以找到对应的设备;服务端提供删除设备的接口,方便设备退出登录,删除对设备的绑定,防止呼叫已经不用的设备。

客户端

iOS和Android的集成这里就不在叙述,详细去看极光官网文档。特别注意Android端,由于推送服务在不同型号设备上表现不一致,需要分别对不同手机厂商做适配。

RTM 实现

集成RTM SDK,前往开发者中心,跟着开发步骤进行集成。

呼叫流程

在这里插入图片描述

发送呼叫邀请的步骤:

  • 获取 ARtmCallKit 实例
  • 设置 ARtmCallDelegate 呼叫邀请代理
  • 主叫调用initWithCalleeId 创建ARtmLocalInvitation,获取ARtmLocalInvitation对象,此时ARtmLocalInvitation对象生命周期开始
  • 主叫调用queryPeersOnlineStatus方法来判断对方是否在线,不在线的用户调用自身的推送接口:把呼叫邀请消息推送给对方
  • 主叫调用 sendLocalInvitation 发送呼叫邀请。被叫收到 remoteInvitationReceived 回调,获取 ARtmRemoteInvitation对象,此时 ARtmRemoteInvitation 对象生命周期开始。主叫收到 localInvitationReceivedByPeer 回调。

接收流程

离线接收

离线场景收到呼叫邀请的推送通知后,点击推送或者点击APP启动APP即可。然后走正常流程,初始化RTM,并登录该设备账号,登录RTM成功后,会收到呼叫的邀请回调,跟下面的在线流程一致。

在线接收

被叫从 remoteInvitationReceived 回调获取 ARtmRemoteInvitation 对象并调用 acceptRemoteInvitation 接受呼叫邀请。被叫收到 remoteInvitationAccepted 回调,此时 ARtmRemoteInvitation 对象生命周期结束。主叫收到 localInvitationAccepted 回调,此时 ARtmLocalInvitation 对象生命周期结束。

注意事项

  • 主叫在发起呼叫前:使用queryPeersOnlineStatus方法先检测对方是否在线,不在线的用户,需要调用下推送接口去送达,同时也要调用sendLocalInvitation方法进行呼叫
  • 发起呼叫后,如果用户一直不接收,会在30s后收到localInvitationFailure的回调,呼叫周期结束。

示例Demo

ARCallPlus: 是 anyRTC 推出一款音视频通话 UI 组件,通过集成该组件,您只需要编写几行代码就可以为您的 App 添加音视频通话功能,并且支持离线唤起能力。ARCallPlus 支持 Android、iOS、Web 等多个开发平台。 欢迎大家使用体验。

在这里插入图片描述

相关文章:

  • IMX6ULL学习笔记(3)——挂载NFS网络文件系统
  • RestTemplate使用
  • Mysql---子查询的三种查询方式( 表子查询,条件子查询,列中子查询)
  • springboot+学校运动会信息管理 毕业设计-附源码231058
  • 进行日常记账后,怎样导出表格
  • Vue3中组件数据的传递以及更改
  • geoserver2.18(8):添加CSW(网络目录服务)扩展及前端开发调用
  • DOM--页面渲染流程
  • LeetCode 85双周赛(补记)
  • Apache DolphinScheduler PMC:开源不一定也要九死一生
  • SpringMVC之拦截器
  • Linux环境Docker的安装过程
  • 第四章【ADFS集成Exchang实现OWA\ECP单点登录SSO】安装Active Directory联合身份验证服务(AD联合身份验证 ADFS)
  • 公众号查题接口
  • 基于瞬态自适应的麻雀搜索算法
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • docker-consul
  • Intervention/image 图片处理扩展包的安装和使用
  • javascript 总结(常用工具类的封装)
  • JavaScript函数式编程(一)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Python3爬取英雄联盟英雄皮肤大图
  • React 快速上手 - 07 前端路由 react-router
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • tensorflow学习笔记3——MNIST应用篇
  • Tornado学习笔记(1)
  • unity如何实现一个固定宽度的orthagraphic相机
  • 从输入URL到页面加载发生了什么
  • 仿天猫超市收藏抛物线动画工具库
  • 最简单的无缝轮播
  • 数据可视化之下发图实践
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #1015 : KMP算法
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C#)获取字符编码的类
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net(C#)中String.Format如何使用
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @GlobalLock注解作用与原理解析
  • @拔赤:Web前端开发十日谈
  • [20150321]索引空块的问题.txt
  • [20161214]如何确定dbid.txt
  • [20171102]视图v$session中process字段含义
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [emuch.net]MatrixComputations(7-12)
  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • [java进阶]——方法引用改写Lambda表达式