融云消息与推送概念答疑

    广大融云开发者在进行融云相关开发过程中,经常遇到对消息体系、推送机制的各种概念困扰。同时,大家对通知、推送,广播、系统消息等概念又没有统一的认识,造成了认知和沟通困难。这里我们为大家详细的解答下融云的整个消息推送体系设计,以便大家可以更好的使用融云进行开发。

    命名约定与概念解析

    融云所有技术和业务文档都将遵循下述命名约定,大家在提交工单时,也请注意用准确的概念描述您的需求或者问题。

    通知

    通知(Notification)是一种用户界面展现概念,是指在设备端以某种形式弹出一条提示。

    在 iOS 平台,表现为如图:

    image
    iOS 通知

    在 Android 平台,表现为如图:

    image
    Android 通知

    通知分为本地通知(Local Notification)和远程通知(Remote Notification)。尽管您看到的是一样的界面展现,但是他们分别来自本地发起和远程发起。本地通知指的是您的应用程序在前台、或者在后台但仍然在生命周期存活,此时收到消息,会直接通过前台的应用程序弹出提示窗口。远程通知指的是您的应用程序已经完全退出,应用进程已经不存在,此时通过 iOS 上的 APNS 系统服务或者 Android 上的服务进程收到消息,并弹出提示栏。大家开发和调试过程中,务必要清楚本地通知和远程通知的区别。

    推送

    推送(Push)是一种技术概念,是指从服务端实时发送信息到客户端。

    大家概念中的典型推送服务是类似 APNS(Apple Push Notification Service)GCM(Google Cloud Messaging) 等服务。在国内,由于谷歌服务不能使用,因此您的应用必须使用第三方或者自己研发的服务来推送。

    因为融云是使用长连接技术来实现 IM 服务的,和典型的 Push 服务具有相同的长连接机制,所以,很多开发者也会直接使用融云来实现推送功能。

    在某些场合,iOS 平台的推送(通过 APNS 的 Push)和远程通知(Remote Notification)表示相同的意思,可以互相替换使用。

    融云现在已推出 Push 服务产品,详情请参见融云推送服务开发指南

    广播

    广播(Broadcast)是一种业务概念,是通过后台管理界面或者调用服务端接口,向 App 中的所有用户发送一条消息。通常“广播”和“推送”是开发者容易产生混淆的地方。

    系统消息

    系统消息(System Message)是一种业务概念,是指利用系统帐号(非用户帐号,用户不可登录)向用户发送的消息,既可以是通过调用广播接口发送给所有人的消息,也可以是加好友等单条通知消息。

    在融云平台中,其实并不存在系统消息的概念,一般系统消息特指会话类型(ConversationType)为“系统(SYSTEM)”的会话中的消息。

    iOS 平台消息与推送逻辑解析

    本地通知与远程通知

    首先要了解 iOS 的通知推送概念。大家平时看到的 iOS 弹出的提示,其实是由两种完全不同的机制产生的:

    image
    iOS 通知

    第一种:本地通知(Local Notification)

    本地通知是通过调用本地接口 [[UIApplication sharedApplication] presentLocalNotificationNow:notification];,由 iOS 设备直接生成发布的。

    第二种:远程通知(Remote Notification)

    远程通知是通过苹果 APNS(Apple Push Notification Service) 服务发送到客户端的通知。

    远程通知的注册

    开发者必须在融云开发者平台上传推送证书并在客户端注册、获取 deviceToken 后,将 deviceToken 告诉融云,才能具备远程通知能力。

    推送证书

    如果您的业务需要 iOS 应用程序具备接收推送的能力,那么您就必须要上传 iOS 推送证书(.p12 格式),证书分为两种:

    第一种:开发证书(Developer Certification)

    开发证书用于测试环境在开发和调试时使用,如果用开发证书打包应用安装在手机上,只能在测试环境使用远程通知功能。

    第二种:发布证书(Distribution Certification)

    发布证书用于生产环境在 App Store 发布时使用,如果用发布证书打包应用安装在手机上,只能在生产环境(线上)使用远程通知功能。

    融云开发者平台 选择需要 Push 推送消息的应用在应用标识模块中,上传 .p12 证书文件后,才能收到融云 Push 推送消息。

    注意:上传证书时,开发证书在 开发 / 测试环境处上传,发布证书在 生产 / 线上环境处上传。

    deviceToken

    deviceToken 用于 APNS 的,从苹果服务器获取的设备唯一标识。

    您需要将获取到的 deviceToken 通过 setDeviceToken 方法传给融云,才能收到苹果的 APNS 远程通知,否则在您的应用退出之后,将无法收到消息的远程通知。

    如何获取 deviceToken 请参见文档

    消息与通知推送逻辑

    通过调用融云的服务端 API 接口向用户推送消息,服务端推送消息目前支持以下几种消息类型:

    • 文本消息
    • 图片消息
    • 语音消息
    • 图文消息
    • 位置消息
    • 添加联系人消息
    • 提示条(小灰条)通知消息
    • 资料通知消息
    • 通用命令消息

    详细的文档说明请参见 Server 开发指南中 消息发送服务

    推送逻辑

    向用户推送消息,分为用户在线状态和离线状态两种情况:

    第一种:离线状态

    用户不在线情况下,会对所有绑定了设备的 iOS 用户,发送远程通知。流程如下:

    App / App Server -> RongCloud Server: 应用或应用服务端向目标用户发送消息 RongCloud Server -> RongCloud Server: 判断用户在线状态 RongCloud Server -> RongCloud Server: 获取已绑定设备的未在线用户 RongCloud Server -> APNS: 向目标用户,发送消息到 APNS 服务 APNS -> App: 通过苹果 APNS 服务,发送远程通知至客户端

    第二种:在线状态

    用户在线情况下,则会直接向客户端发送通知消息。流程如下:

    App / App Server -> RongCloud Server: 应用或应用服务端向目标用户发送消息 RongCloud Server -> RongCloud Server: 判断用户在线状态 RongCloud Server -> App: 对在线用户,直接发送消息
    注意:应用切换至后台 2 分钟后,将自动切断与服务器的连接,此时应用为离线状态,新消息将会以 Push 方式推送。 用户在线状态下,应用在前台显示时,不会收到消息通知。

    自定义推送文字

    开发者可以通过 pushContent 自定义设置用户收到推送消息时显示的内容。如果推送消息时未填写 pushContent 则显示默认消息内容,如:文本消息显示文本内容,图片消息显示为“[图片]”。

    开发者使用 pushContent 自定义推送文字后,需要在客户端实现 – onRCIMCustomLocalNotification:withSenderName: 此方法是当 App 处于后台时,接收到消息并弹出本地通知的回调方法,参见 API 说明文档

    注意:如果开发者推送的不是融云内置的消息类型,为自定义消息类型时,pushContent 必须填写,否则用户无法收到推送通知。 详细请参见 Server 开发指南中消息发送服务

    自定义推送声音与振动

    推送声音,用户收到推送消息时的通知提示音,融云消息推送提示声音与振动,默认为手机系统设置的声音与振动提示状态。

    在 iOS 平台下,开发者可通过开发者后台,应用标识 -> 自定义 Push 声音 中输入 iOS 系统声音名,重新设置生产和开发环境的推送提示音,如果开发者使用的是自己创建的声音,而不是 iOS 系统声音,需要开发者将自己创建的声音一同打包到应用程序中,然后在开发者后台 自定义 Push 声音 处输入声音文件名保存即可。

    image
    自定义 Push 声音

    自定义推送附加数据

    推送附加数据,推送消息时同消息一起推送到客户端的附加文本信息,可通过 pushData 字段实现(pushData 对应 payload 字段)。

    如果开发者在推送一条消息后,希望消息接收端进行一些特殊的逻辑处理,可以在推送消息时设置 pushData 内容,客户端收到远程通知信息解析后为对应的 pushData ,根据 pushData 中的附加信息,进行对应的处理操作。

    推送消息文档请参见 Server 开发指南中 消息发送服务,客户端请参见 App 接收消息推送格式

    全局与会话消息免打扰

    如果用户不想受到消息提醒的干扰,融云提供两种消息免打扰方式:全局消息免打扰会话消息免打扰

    全局消息免打扰,设置后用户在接收通过融云客户端或服务端发送的所有消息时,如果客户端在后台运行,将不会进行通知提醒,但可以收到消息内容。如果客户端为离线状态,将不会收到远程通知提醒。

    会话消息免打扰,根据会话类型、会话 Id 设置消息提醒状态,设置后如果客户端在后台运行时,会话中有新的消息,将不会进行通知提醒,可以收到消息内容。如果客户端为离线状态,将不会收到远程通知提醒。

    Android 平台通知与推送逻辑解析

    消息与通知推送逻辑

    通过调用融云的服务端 API 接口向用户推送消息,服务端推送消息目前支持以下几种消息类型:

    • 文本消息
    • 图片消息
    • 语音消息
    • 图文消息
    • 位置消息
    • 添加联系人消息
    • 提示条(小灰条)通知消息
    • 资料通知消息
    • 通用命令消息

    详细的文档说明请参见 Server 开发指南中消息发送服务

    推送逻辑

    向用户推送消息,分为用户在线状态和离线状态两种情况:

    第一种:离线状态

    用户不在线情况下,会对所有需要收到消息的用户,发送远程通知。流程如下:

    App / App Server -> RongCloud Server: 应用或应用服务端向目标用户发送消息 RongCloud Server -> RongCloud Server: 判断用户在线状态 RongCloud Server -> RongCloud Push Server: 向未在线目标用户,发消息到 RongCloud Push Server RongCloud Push Server -> App: 向目标用户,发送远程通知至客户端

    第二种:在线状态

    用户在线情况下,则会直接向客户端发送通知消息。流程如下:

    App / App Server -> RongCloud Server: 应用或应用服务端向目标用户发送消息 RongCloud Server -> RongCloud Server: 判断用户在线状态 RongCloud Server -> App: 对在线用户,直接发送消息

    自定义推送文字

    开发者可以通过 pushContent 自定义设置用户收到推送消息时显示的内容。如果推送消息时未填写 pushContent 则显示默认消息内容,如:文本消息显示文本内容,图片消息显示为“[图片]”。

    注意:如果开发者推送的不是融云内置的消息类型,为自定义消息类型时,pushContent 必须填写,否则用户无法收到推送通知。 详细请参见 Server 开发指南中消息发送服务

    自定义推送声音与振动

    推送声音是用户收到推送消息时的通知提示音,融云消息推送提示声音与振动,默认为手机系统设置的声音与振动提示状态。

    如果开发者想自定义消息推送提示音与振动状态,可以在接收消息监听Push 消息监听方法中自行处理,并在两个方法中返回 true 告知融云 SDK 走自己的处理方式。

    在接收消息监听中可以对本地通知的提示音和振动状态进行处理,接收消息监听文档

    在 Push 消息监听中可以对远程通知的提示音和振动状态进行处理,Push 消息监听文档

    自定义推送附加数据

    推送附加数据是推送消息时同消息一起推送到客户端的附加文本信息,可通过 pushData 字段实现。

    如果开发者在推送一条消息后,希望在消息接收端进行一些特殊的逻辑处理,可以在推送消息时设置 pushData 内容,客户端收到远程通知信息解析后为对应的 pushData ,根据 pushData 中的附加信息,进行对应的处理操作。

    推送消息文档请参见 Server 开发指南中消息发送服务

    消息免打扰

    如果用户不想受到消息提醒的干扰,融云提供两种消息免打扰方式:全局消息免打扰会话消息免打扰

    全局消息免打扰,设置后用户在接收通过融云客户端或服务端发送的所有消息时,如果客户端在后台运行,将不会进行通知提醒,但可以收到消息内容。如果客户端为离线状态,将不会收到远程通知提醒。

    会话消息免打扰,根据会话类型、会话 Id 设置消息提醒状态,设置后如果客户端在后台运行时,会话中有新的消息,将不会进行通知提醒,可以收到消息内容。如果客户端为离线状态,将不会收到远程通知提醒。

    广播与系统消息

    广播消息

    广播消息是给应用中的所有用户发送一条消息,如果用户未在线,会对所有未在线并满足推送条件的用户发送 Push 通知,发送方法请参见发送广播消息方法

    系统消息

    系统消息是用应用内的系统帐号向一个或多个用户发送系统消息,如果目标用户未在线,会对所有未在线并满足推送条件的用户发送 Push 通知,发送方法请参见发送系统消息方法