<commit_before>
## MixPush：混合推送SDK，快速集成六个厂商推送，共享系统推送通道，杀死也能收到推送，推送到达率90%以上
[![Download](https://api.bintray.com/packages/mixpush/maven/mixpush-core/images/download.svg)](https://bintray.com/mixpush/maven/mixpush-core)



基于 [统一推送联盟](http://chinaupa.com/) 的思想，快速集成了六个厂商的推送平台，共享系统的厂商推送通道，避免APP需要长期在后台运行，杀死APP也能收到推送，大大提高推送到达率。接入有一定的开发成本，需要前后端一起参与才可以完成，如果遇到什么问题可以发Issue提问解答。

1. 开发者只需要少量代码即可集成 小米、华为、魅族、OPPO、VIVO，苹果的厂商推送；

2. 根据手机厂商推送的支持情况智能选择不同的推送；

3. 共享系统推送通道，杀死APP也能收到推送，推送到达率高达90%以上；

4. 提供服务端的Java代码，方便开发者快速实现服务端；

5. SDK已经为开发者考虑好各种问题，避免碰壁，从2人超一周开发时间压缩到只需要半天时间即可。

  ​    


> 本SDK不支持商业推送平台，因为第三方商业推送SDK的免费版本基本都存在黑产行为，偷偷给用户推送通知栏广告，诱导用户下载其他APP或打开其他APP，非法获利。
>
> 这一点我们已经亲身经历过，我们集成的国内排名前三的推送平台就对我们公司的APP下了毒手，618的时候偷偷给用户发伪造成拼多多、淘宝、京东、微博的通知栏消息，诱导用户打开电商APP领红包，我们通过源码分析查证了，并且他们的商务已经向我公司道歉，所以切莫使用免费的商业推送SDK。

#### 厂商推送平台介绍

在以前没有厂商推送的情况下，各家公司或推送平台为了让APP可以在后台收到推送，会通过各种方式让APP保持后台运行，甚至还会出现`APP之间相互唤醒`。近年来，手机系统的管控越来越严格，不再允许后台运行也不允许APP相互唤醒。如果无法收到推送，会导致很多APP无法正常工作，比如微信消息，淘宝订单等。为了解决APP收到推送的问题，国内的手机厂商纷纷推出了自己的厂商推送平台，APP无需在后台运行即可收到推送，可以大大节省手机的电量问题。那么另外一个问题来了，这么多推送平台，每一个平台的接入方式都不一样，会导致接入成本大大增加，为了解决这个问题，MixPush 来了。

| 推送平台                                                     | 透传   | 全局推送 | 别名/标签 | 支持说明                                                     |
| ------------------------------------------------------------ | ------ | -------- | --------- | ------------------------------------------------------------ |
| [小米推送](https://dev.mi.com/console/appservice/push.html)  | 支持   | 支持     | 支持      | 所有Android设备，小米设备支持系级别推送，其它设备支持普通推送 |
| [华为推送](https://developer.huawei.com/consumer/cn/console) | 支持   | 不支持   | 不支持    | 仅华为设备，部分EMUI4.0和4.1，及EMUI5.0及之后的华为设备。    |
| [OPPO推送](https://push.oppo.com)                            | 不支持 | 支持     | 支持      | 仅OPPO和一加手机，支持ColorOS3.1及以上的系统。               |
| [VIVO推送](https://dev.vivo.com.cn/openAbility/pushNews)     | 不支持 | 支持     | 支持      | 仅VIVO手机，部分 Android 9.0，及 9.0 以上手机                |
| [魅族推送](http://open-wiki.flyme.cn/doc-wiki/index#id?129)  | 不支持 | 支持     | 支持      | 仅魅族手机，Flyme系统全平台                                  |
| [APNs](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns) | 不支持 | 不支持   | 不支持    | 仅苹果设备                                                   |
| [小米推送 APNs](https://dev.mi.com/console/doc/detail?pId=98) | 不支持 | 支持     | 支持      | 仅苹果设备，代替APNs，可以有效降低服务器压力                 |
##### 建议

1. 如果手机支持建厂商推送就使用厂商推送SDK，否则使用小米推送。
2. 由于华为推送不支持别名和标签，所以建议所有的手机都统一通过regId进行推送。
3. 由于多数的推送SDK不支持透传，如果APP需要支持透传，建议统一使用小米推送作为透传方案，但是如果使用小米作为所有Android手机的透传功能，那么小米推送就不再支持全局推送。
4. 由于华为推送和APNs不支持全局推送，如果要推送给所有用户，请查询最近3个月有打开APP的用户，进行分组推送。因为多数的有效期都是三个月，就算推送用户也收不到，如果把所有历史的用户都查询出来，推送压力将会加倍。
5. 建议 iOS 也使用[小米推送](https://dev.mi.com/console/doc/detail?pId=98)，可以有效降低服务器的推送压力，特别是在全局推送和分组推送的时候。



### 注册各大的推送平台的账号

这个步骤在这里就不详细展开说了，自行注册配置，除了小米推送外，其它推送都必须要公司主体才可以申请，请务必注意，避免浪费时间。

## Android 客户端配置

#### 修改项目的根目录 build.gradle

```groovy
buildscript {
    repositories {
      	...
        jcenter()
        maven { url 'http://developer.huawei.com/repo/' }
    }
    dependencies {
        ...
        classpath 'com.huawei.agconnect:agcp:1.3.1.300'
    }
}
allprojects {
    repositories {
        ...
        jcenter()
        maven { url 'http://developer.huawei.com/repo/' }
    }
}
```
#### 修改 app 目录的 build.gradle 

小米、VIVO和魅族需要在推送管理后台创建项目并且把对应的APP_ID和APP_KEY配置到文件中，OPPO比较特殊，是配置 APP_KEY 和 APP_SECRET。

```groovy
apply plugin: 'com.huawei.agconnect'
android {
    compileSdkVersion 29
    defaultConfig {
        ...
        manifestPlaceholders["VIVO_APP_ID"] = "<VIVO_APP_ID>"
        manifestPlaceholders["VIVO_APP_KEY"] = "<VIVO_APP_KEY>"
        manifestPlaceholders["MI_APP_ID"] = "<MI_APP_ID>"
        manifestPlaceholders["MI_APP_KEY"] = "<MI_APP_KEY>"
        manifestPlaceholders["OPPO_APP_KEY"] = "<OPPO_APP_KEY>"
        manifestPlaceholders["OPPO_APP_SECRET"] = "<OPPO_APP_SECRET>"
        manifestPlaceholders["MEIZU_APP_ID"] = "<MEIZU_APP_ID>"
        manifestPlaceholders["MEIZU_APP_KEY"] = "<MEIZU_APP_KEY>"
    }
}
dependencies {
    implementation 'com.mixpush:mixpush-core:2.0.9'// 核心包
    implementation 'com.mixpush:mixpush-mi:2.0.9' // 小米推送
    implementation 'com.mixpush:mixpush-meizu:2.0.9' // 魅族推送
    implementation 'com.mixpush:mixpush-huawei:2.0.9' // 华为推送
    implementation 'com.mixpush:mixpush-oppo:2.0.9' // OPPO推送
    implementation 'com.mixpush:mixpush-vivo:2.0.9' // VIVO推送
}
```

#### 华为推送

华为推送麻烦一些，需要做3步配置：

1. 参考[官方文档](https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/Preparations)下载 `“agconnect-services.json”`并拷贝到app目录。
2. 配置SHA256证书指纹，否则会提示 **错误 6003 **，详细查看[通用错误码](https://developer.huawei.com/consumer/cn/doc/development/HMS-2-References/hmssdk_huaweipush_api_reference_errorcode)。
3. 配置指纹证书，否则会提示 **错误 907135702**，详细查看[通用错误码](https://developer.huawei.com/consumer/cn/doc/development/HMS-2-References/hmssdk_huaweipush_api_reference_errorcode)。



![华为图片配置](readme_img_huawei_sha256_settings.png)


<commit_msg>更新华为文档链接<commit_after>
## MixPush：混合推送SDK，快速集成六个厂商推送，共享系统推送通道，杀死也能收到推送，推送到达率90%以上
[![Download](https://api.bintray.com/packages/mixpush/maven/mixpush-core/images/download.svg)](https://bintray.com/mixpush/maven/mixpush-core)



基于 [统一推送联盟](http://chinaupa.com/) 的思想，快速集成了六个厂商的推送平台，共享系统的厂商推送通道，避免APP需要长期在后台运行，杀死APP也能收到推送，大大提高推送到达率。接入有一定的开发成本，需要前后端一起参与才可以完成，如果遇到什么问题可以发Issue提问解答。

1. 开发者只需要少量代码即可集成 小米、华为、魅族、OPPO、VIVO，苹果的厂商推送；

2. 根据手机厂商推送的支持情况智能选择不同的推送；

3. 共享系统推送通道，杀死APP也能收到推送，推送到达率高达90%以上；

4. 提供服务端的Java代码，方便开发者快速实现服务端；

5. SDK已经为开发者考虑好各种问题，避免碰壁，从2人超一周开发时间压缩到只需要半天时间即可。

  ​    


> 本SDK不支持商业推送平台，因为第三方商业推送SDK的免费版本基本都存在黑产行为，偷偷给用户推送通知栏广告，诱导用户下载其他APP或打开其他APP，非法获利。
>
> 这一点我们已经亲身经历过，我们集成的国内排名前三的推送平台就对我们公司的APP下了毒手，618的时候偷偷给用户发伪造成拼多多、淘宝、京东、微博的通知栏消息，诱导用户打开电商APP领红包，我们通过源码分析查证了，并且他们的商务已经向我公司道歉，所以切莫使用免费的商业推送SDK。

#### 厂商推送平台介绍

在以前没有厂商推送的情况下，各家公司或推送平台为了让APP可以在后台收到推送，会通过各种方式让APP保持后台运行，甚至还会出现`APP之间相互唤醒`。近年来，手机系统的管控越来越严格，不再允许后台运行也不允许APP相互唤醒。如果无法收到推送，会导致很多APP无法正常工作，比如微信消息，淘宝订单等。为了解决APP收到推送的问题，国内的手机厂商纷纷推出了自己的厂商推送平台，APP无需在后台运行即可收到推送，可以大大节省手机的电量问题。那么另外一个问题来了，这么多推送平台，每一个平台的接入方式都不一样，会导致接入成本大大增加，为了解决这个问题，MixPush 来了。

| 推送平台                                                     | 透传   | 全局推送 | 别名/标签 | 支持说明                                                     |
| ------------------------------------------------------------ | ------ | -------- | --------- | ------------------------------------------------------------ |
| [小米推送](https://dev.mi.com/console/appservice/push.html)  | 支持   | 支持     | 支持      | 所有Android设备，小米设备支持系级别推送，其它设备支持普通推送 |
| [华为推送](https://developer.huawei.com/consumer/cn/console) | 支持   | 不支持   | 不支持    | 仅华为设备，部分EMUI4.0和4.1，及EMUI5.0及之后的华为设备。    |
| [OPPO推送](https://push.oppo.com)                            | 不支持 | 支持     | 支持      | 仅OPPO和一加手机，支持ColorOS3.1及以上的系统。               |
| [VIVO推送](https://dev.vivo.com.cn/openAbility/pushNews)     | 不支持 | 支持     | 支持      | 仅VIVO手机，部分 Android 9.0，及 9.0 以上手机                |
| [魅族推送](http://open-wiki.flyme.cn/doc-wiki/index#id?129)  | 不支持 | 支持     | 支持      | 仅魅族手机，Flyme系统全平台                                  |
| [APNs](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns) | 不支持 | 不支持   | 不支持    | 仅苹果设备                                                   |
| [小米推送 APNs](https://dev.mi.com/console/doc/detail?pId=98) | 不支持 | 支持     | 支持      | 仅苹果设备，代替APNs，可以有效降低服务器压力                 |
##### 建议

1. 如果手机支持建厂商推送就使用厂商推送SDK，否则使用小米推送。
2. 由于华为推送不支持别名和标签，所以建议所有的手机都统一通过regId进行推送。
3. 由于多数的推送SDK不支持透传，如果APP需要支持透传，建议统一使用小米推送作为透传方案，但是如果使用小米作为所有Android手机的透传功能，那么小米推送就不再支持全局推送。
4. 由于华为推送和APNs不支持全局推送，如果要推送给所有用户，请查询最近3个月有打开APP的用户，进行分组推送。因为多数的有效期都是三个月，就算推送用户也收不到，如果把所有历史的用户都查询出来，推送压力将会加倍。
5. 建议 iOS 也使用[小米推送](https://dev.mi.com/console/doc/detail?pId=98)，可以有效降低服务器的推送压力，特别是在全局推送和分组推送的时候。



### 注册各大的推送平台的账号

这个步骤在这里就不详细展开说了，自行注册配置，除了小米推送外，其它推送都必须要公司主体才可以申请，请务必注意，避免浪费时间。

## Android 客户端配置

#### 修改项目的根目录 build.gradle

```groovy
buildscript {
    repositories {
      	...
        jcenter()
        maven { url 'http://developer.huawei.com/repo/' }
    }
    dependencies {
        ...
        classpath 'com.huawei.agconnect:agcp:1.3.1.300'
    }
}
allprojects {
    repositories {
        ...
        jcenter()
        maven { url 'http://developer.huawei.com/repo/' }
    }
}
```
#### 修改 app 目录的 build.gradle 

小米、VIVO和魅族需要在推送管理后台创建项目并且把对应的APP_ID和APP_KEY配置到文件中，OPPO比较特殊，是配置 APP_KEY 和 APP_SECRET。

```groovy
apply plugin: 'com.huawei.agconnect'
android {
    compileSdkVersion 29
    defaultConfig {
        ...
        manifestPlaceholders["VIVO_APP_ID"] = "<VIVO_APP_ID>"
        manifestPlaceholders["VIVO_APP_KEY"] = "<VIVO_APP_KEY>"
        manifestPlaceholders["MI_APP_ID"] = "<MI_APP_ID>"
        manifestPlaceholders["MI_APP_KEY"] = "<MI_APP_KEY>"
        manifestPlaceholders["OPPO_APP_KEY"] = "<OPPO_APP_KEY>"
        manifestPlaceholders["OPPO_APP_SECRET"] = "<OPPO_APP_SECRET>"
        manifestPlaceholders["MEIZU_APP_ID"] = "<MEIZU_APP_ID>"
        manifestPlaceholders["MEIZU_APP_KEY"] = "<MEIZU_APP_KEY>"
    }
}
dependencies {
    implementation 'com.mixpush:mixpush-core:2.0.9'// 核心包
    implementation 'com.mixpush:mixpush-mi:2.0.9' // 小米推送
    implementation 'com.mixpush:mixpush-meizu:2.0.9' // 魅族推送
    implementation 'com.mixpush:mixpush-huawei:2.0.9' // 华为推送
    implementation 'com.mixpush:mixpush-oppo:2.0.9' // OPPO推送
    implementation 'com.mixpush:mixpush-vivo:2.0.9' // VIVO推送
}
```

#### 华为推送

华为推送麻烦一些，需要做3步配置：

1. 参考[官方文档](https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-app-quickstart-0000001071490422)下载 `“agconnect-services.json”`并拷贝到app目录。
2. 配置SHA256证书指纹，否则会提示 **错误 6003 **，详细查看[通用错误码](https://developer.huawei.com/consumer/cn/doc/development/HMS-2-References/hmssdk_huaweipush_api_reference_errorcode)。
3. 配置指纹证书，否则会提示 **错误 907135702**，详细查看[通用错误码](https://developer.huawei.com/consumer/cn/doc/development/HMS-2-References/hmssdk_huaweipush_api_reference_errorcode)。



![华为图片配置](readme_img_huawei_sha256_settings.png)



{'fraction_non_alphanumeric': 0.15919059011164274, 'fraction_numerical': 0.01933811802232855, 'mean_word_length': 3.2084731543624163, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 25, 'https://': 24, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 18, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1385604', 'n_tokens_mistral': 5822, 'n_tokens_neox': 6556, 'n_words': 338}