# PushLibrary
**Repository Path**: LYC161616/PushLibrary
## Basic Information
- **Project Name**: PushLibrary
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-12-17
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 一个集合所有主流厂商的推送框架
### 前言
由于项目需要,开发了一个整合了所有主流厂商的推送框架。本框架集合了小米,华为,OPPO,VIVO,极光等五家推送。其中我们可以在初始化时选择是否支持这四家厂商推送。先贴下项目路径:[PushLibrary](https://github.com/YoloHuang/PushLibrary)
目前的推送逻辑是,如果初始化时都支持,会根据用户手机型号来自动判断使用哪家的推送。如果用户手机不属于当前四大厂商,则使用极光推送。考虑到四大厂商推送也可能不支持早期版本的手机,会有在初始化出错之后选择极光推送的容错处理。(后续可能会继续加入个推,友盟推送等平台推送,但我们日常开发中只需要添加一个就行了)
目前我们在使用各大推送平台时,在用户点击跳转这个选项上,都是设置的自定义行为。由服务器传入额外信息后APP根据信息自行处理,例如跳转到不同界面,显示不同信息。如果APP不做任何处理,点击通知不会产生任何效果,也不会自动打开APP。
鄙人不才,可能很多需求没考虑清楚。大家如果发现BUG或者有更好的解决方案,欢迎提issue。觉得有用或者出于鼓励,也可以star一下,在此拜谢。
### demo预览
|小米推送|vivo推送|极光推送|
|:-------:|:-------:|:-------:|
| | | |
华为手机无法录屏,所以只有截图
OPPO推送无法注册个人账户,暂时没有预览
### 快速集成
#### 1.添加依赖
在项目的`build.gradle`中,需要在`allprojects`最后添加`jitpack`
```
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
```
在APP的`build.gradle`中添加如下依赖,版本号以最新为准
```
implementation 'com.github.YoloHuang:PushLibrary:v1.0'
```
#### 2.在`AndroidManifest.xml`的`application`标签下添加厂商推送的ID和key等相关资源(如果只支持部分厂商,只需要添加支持的厂商信息就行)
```
```
#### 3.初始化pushlibrary
初始化仅需要在application的onCreate中增加如下代码。在这其中,需要注意:设置debug需要在init之前,这样可以确保log打印完整。设置debug模式仅仅是针对log是否打印。debug默认为false,如果不需要打印log不设置即可。
```
override fun onCreate() {
super.onCreate()
PushTargetManager.getInstance().setDebug(true)
PushTargetManager.getInstance().init(this)
}
```
#### 4.登录,设置别名,登出等接口,其中登录需要在activity中执行(是由于华为推送登录需要传入activity对象)。框架中,将登录和接受通知、登出和不接受通知放在一起处理,后面会拆分开来,满足不同需求。
```
/**
* 登录
*/
PushTargetManager.getInstance().loginIn(this)
/**
* 设置别名
*/
PushTargetManager.getInstance().setAlias(alias)
/**
* 登出
*/
PushTargetManager.getInstance().loginOut()
```
#### 5.在`AndroidManifest.xml`的`application`标签下注册静态广播。
```
```
新建一个receiver继承框架中的BasePushReceiver,重写onReceiveNotificationClick等方法,推送的相关处理都是在这里处理。
```
class TestPushReceiver : BasePushReceiver() {
companion object {
val ACTION_BROADCAST:String = "com.yolo.pushlibrary.ACTION_PUSH"
val PUSH_LOG = "push_log"
}
override fun onReceiveNotification(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
override fun onReceiveNotificationClick(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
override fun onReceiveMessage(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
override fun onTokenSet(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
override fun onInitResult(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
override fun onLoginOut(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
override fun onSetAlias(context: Context, info: ReceiverInfo) {
sendBroadCast(context,info)
}
fun sendBroadCast(context: Context,info: ReceiverInfo){
val intent= Intent(ACTION_BROADCAST)
intent.putExtra(PUSH_LOG,info)
intent.`package` = context.packageName
context.sendBroadcast(intent)
}
}
```
这一步中,可能会存在Android8.0无法接收动态注册广播问题。但是我在8.0测试机上没发现,后续如果出现此问题,会想办法解决。
以上,就完成了整个框架的快速集成。
### 关于集成各家推送中遇到的问题
#### 极光推送,小米推送,OPPO推送
极光是一个成熟的推送平台,整个集成流程行云流水,文档也十分完整,基本没什么问题。小米推送也是如此。OPPO推送由于集成完后无法注册个人账号测试,所以效果未知。各位大佬如果可以弄到测试账号在下感激不尽。
#### vivo推送,华为推送
vivo推送中遇到的主要问题是,在服务器端,按照vivo接口文档,我们在clientCustomMap中放入我们所需要额外信息。同时设置skipType为3自定义。这样我们可以直接根据通知中的额外信息让APP自行处理,而不需要在服务器端设置。但是在skipContent这个参数上有一些疑问,不能为空,我们又不知道该传入什么。最后找到他们的官方FAE QQ交流,得知这个参数随便填一下就行,APP也不用做处理。
华为推送,讲道理,有点坑。集成起来最复杂不说,遇到的问题还贼多。华为推送在点击通知这块还是选择自定义由APP处理。但是我们需要在`AndroidManifest.xml`中添加intent-filter过滤器,并且在服务器端使用同种过滤器。而这点,在文档中藏的很深。[华为推送服务端文档中关于这个问题的描述](https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_api_reference_agent_s2)
```
```
还遇到的一个问题就是,签名之后注册华为推送失败。这个是我自己这边没有进行混淆处理导致的。当时我的混淆处理加在pushlibrary中,却一直不生效。后面将处理加在APP中,问题解决。目前推送框架已经解决了这个问题。
### 后续计划
写了个框架就相当于开了个坑,开坑不填那肯定是不行的。后续的计划有:
1.增加标签功能
2.增加友盟,个推平台
3.优化代码,减小包的大小
4.将各个推送分开做库,再使用统一库做统一处理。这样可以满足不同需求。
### 相关API介绍
pushlibrary详细api
|方法名称|描述及解释|
|---------|:-------:|
|init(Application application )|初始化OnePush,建议在Application中onCreate()方法|
|init(Application application,boolean enableHWPush,boolean enableOppoPush,boolean enableVivoPush,boolean enableXIAOMIPush )|初始化OnePush,建议在Application中onCreate()方法,可以设置是否支持该厂商推送|
|loginIn(Activity activity)|注册消息推送,需要在activity中调用|
|loginOut()|取消注册消息推送|
|setAlias(String alias)|绑定别名|
|setDebug(boolean)|设置是否为debug模式|
BasePushReceiver详细api
|方法名称|描述及解释|
|---------|:-------:|
|onReceiveNotification(Context context ,ReceiverInfo info)|转发通知|
|onReceiveMessage(Context context ,ReceiverInfo info)|转发透传消息|
|onTokenSet(Context context ,ReceiverInfo info)|转发华为token|
|onInitResult(Context context ,ReceiverInfo info)|转发初始化成功消息,info中包含推送注册平台信息|
|onSetAlias(Context context ,ReceiverInfo info)|转发设置别名成功的消息,info中包含别名|
|onLoginOut(Context context ,ReceiverInfo info)|转发登出成功消息|
### 感谢
在做这个框架时,参考了[OnePush](https://github.com/pengyuantao/OnePush)和 [Push](https://github.com/Luomingbear/Push),在此感谢各位同行大佬。