Files
push_server/README.md
heavyrian2012 97deb4fa8a update readme
2025-07-19 14:01:52 +08:00

56 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 野火IM 推送服务
作为野火IM的推送服务的演示支持小米、华为、魅族、OPPO、Vivo、苹果apns和谷歌FCM。并且可以添加更多的推送厂商和自定义推送模式。
## 工作原理
推送功能对于所有IM来说都是非常重要的功能然而手机系统又没有统一的推送服务对接起来难度很大。另外一方面客户有不同对接需求有的要求使用第三方有的要求使用厂商推送有的需要在海外添加谷歌推送有的对推送的格式有不同的要求。
为了满足各种各样的需求提供足够好的灵活性野火IM把推送子系统独立出来客户只要理解了推送子系统运行的原理就能做好各种自定义处理。
![架构图](https://docs.wildfirechat.cn/architecture/wildfire_architecture.png)
> 如果架构图无法查看,可以点击[这里](https://docs.wildfirechat.cn/architecture/wildfire_architecture.png)查看
图中紫色部分为推送子系统,推送子系统的所有源码都是开源的,且可以随意修改。推送子系统的工作流程如下:
1. 应用启动后推送SDK初始化判断采用那种推送服务比如华为手机就用华为推送小米手机就用小米推送或者全部或部分使用第三方推送。如果客户要加其它推送也是在这里加。选定好推送厂商后就初始化对应推送厂商的SDK注册成功后会得到推送token调用IM SDK的setDeviceToken传入推送token和类型。注意类型是可以扩展的而且对IM系统没有任何影响的。
2. SDK被调用setDeviceToken后会把推送token和类型传入到IM服务IM服务为对应手机保存下来以备后用。事实上IM服务不需要理解token和type的含义只需要透传给推送服务即可。
3. IM服务处理消息时发现用户不在线或者下发消息失败则会启动是否要推送的决策比如消息是否需要推送预制消息已经支持自定义消息需要传入push content用户是否全局静音会话是否被静音客户有多少天没有登录超过7天没登录就不推送。达到推送条件后跟把所有推送需要的内容打包发给推送服务。
4. 推送服务接收到IM服务的请求把推送数据放到消费队列中并立即返回IM服务不能被阻塞然后逐步处理推送事件。每个推送事件中都包含了所有需要处理的数据其中包括1步骤中的推送Token和类型然后根据类型来调用对用推送厂商的服务比如华为/小米/苹果/第三方厂商/谷歌/OPPO/Vivo等调用他们的SDK进行推送。
5. 系统厂商或第三方推送厂商利用他们的通道推送到客户端一般有2种形式一种是通知栏不激活应用只弹出通知栏另外一种形式是透传把应用激活并把数据传递到客户端的推送相关代码种应用激活后有一段活跃时间在这个活跃时间连接IM服务接收下来消息并弹出本地通知。
## 通知类型
一般情况下有2种推送一种是本地通知另外一种是远程推送。
1. 本地通知:指应用在后台处于激活状态,当有此用户的新消息时,消息会被收下来,然后本地弹出通知。
2. 远程推送:指应用处于冻结或者杀死状态,当有此用户的新消息时,消息无法被收下来,需要借助推送服务通知到用户。
本地通知和远程推送在手机上的表现很接近,都是应用放到后台,然后有人给此账号发送消息,通知栏弹出通知。实际上处理流程完全不同。本项目处理的是远程推送。***在处理通知问题时,首先要确认的是本地通知还是远程推送***。
## 远程推送的条件
IM服务判断是否需要推送需要做如下判断
1. 检查客户端是否在线,如果在线不推送。
2. 如果客户端不在线超过7天可以配置不推送。
3. 判断消息内容是否有pushContent和pushContent内置消息会默认处理如果都没有不推送。
4. 如果deviceToken不存在不推送。
5. 检查平台,如果不是支持推送的平台,不推送。
6. 判断会话是否被静音,静音且不是@消息不推送
7. 检查PC在线时是否设置PC在线时静音是的话不推送。
8. 是否全局静音,全局静音时不推送。
9. 是否开启免打扰,在免打扰时间段内不推送。
## 接入推送
接入推送并不是简单得将推送服务跑起来即可,请详细阅读[接入推送流程](./push.md)
## 添加其它推送服务
由前面的介绍可以看出推送子服务是独立于IM服务而且客户端和服务器部分都是开源的而且考虑到了扩展性可以很容易地添加其它推送类型。具体步骤如下
1. 必须理解推送的工作原理,知道流程是:客户端注册推送-》客户端注册推送成功得到deviceToken-》客户端调用设置deviceToken和类型这两个数据被存储到IM服务。当IM服务需要推送时IM服务打包推送信息包括deviceToken和类型请求到推送服务-》推送服务根据类型选择服务商推送数据。
2. 客户端扩展一个新的推送类型。
3. 客户端在应用启动时,添加处理这种推送类型的注册
4. 在注册成功后会得到deviceToken调用IM SDK的setDeviceToken接口传人deviceToken和类型。
5. 推送服务添加对这种类型的处理。
## 接入个推或者极光
我们提供有个推的分支,切换过去,然后按照个推文档申请推送功能。但要注意只有开通厂商推送功能才可以真的做到离线推送。极光推送可以参考个推或者上面添加其他推送服务的说明来添加,注意同样需要开通厂商推送来实现离线推送。
## 使用到的开源代码
1. [TypeBuilder](https://github.com/ikidou/TypeBuilder) 一个用于生成泛型的简易Builder
## LICENSE
UNDER MIT LICENSE. 详情见LICENSE文件