flutter_mix_push
基于 MixPush 改造的 Flutter 混合推送插件:
- Android:集成国内厂商系统级推送通道(小米 / 华为 / 荣耀 / OPPO / vivo / 魅族),共享系统推送通道,杀死 App 也能收到推送。SDK 均升级到稳定版本(小米 7.9.2 / 华为 6.13.0.301 / 荣耀 7.0.61.303 / OPPO 3.7.1 / vivo 4.1.3.0 / 魅族 5.0.3)。
- iOS:直接使用苹果 APNs(已去掉小米推送 APNs 服务),提供完整的通知权限申请、deviceToken 注册、前台展示、消息接收、点击跳转监听。
- 可复用:改造后的 MixPush 推送代码(
android/src/main/kotlin/com/mixpush/)完全 Kotlin + Gradle Kotlin DSL 实现,按厂商文件夹分区,可整体复制到任意 Android 工程复用。
目录结构
flutter_mix_push/
├── lib/ # Flutter 插件 Dart API
│ ├── flutter_mix_push.dart # 插件入口(注册/获取 regId/事件流)
│ ├── mix_push_message.dart # 推送消息模型
│ └── mix_push_platform.dart # 平台/regId 模型
├── android/ # 插件 Android 实现 + 全部推送源码(单一模块)
│ ├── src/main/
│ │ ├── kotlin/com/flutter_mix_push/ # FlutterPlugin + MethodChannel/EventChannel 桥接
│ │ └── kotlin/com/mixpush/ # 推送核心(core)+ 各厂商(mi/huawei/honor/meizu/oppo/vivo)分区
│ ├── libs/ # 小米/OPPO/vivo 厂商 SDK jar(无 maven 坐标)
│ └── AndroidManifest.xml # 各厂商推送组件统一声明
├── ios/
│ ├── Classes/ # iOS APNs 插件实现(Swift)
│ └── flutter_mix_push.podspec
└── example/ # 使用示例(demo)
快速开始
在 pubspec.yaml 中添加依赖:
dependencies:
flutter_mix_push: ^1.0.0 # 从 pub.flutter-io.cn 安装
或使用本地 / git 依赖:
dependencies:
flutter_mix_push:
path: ../flutter_mix_push # 本地依赖
在 main() 中初始化:
import 'package:flutter_mix_push/flutter_mix_push.dart';
// 1. 申请通知权限(Android 13+ / iOS)
await FlutterMixPush.requestPermission();
// 2. 注册推送(defaultPlatform 默认 mi,非厂商机型由小米兜底)
await FlutterMixPush.register();
// 3. 冷启动点击消息补发
final launchMessage = await FlutterMixPush.getLaunchMessage();
// 4. 监听注册成功(上报 regId 到服务端)
FlutterMixPush.onRegisterSucceed.listen((platform) {
print('注册成功: ${platform.platform} / ${platform.regId}');
});
// 5. 监听消息到达
FlutterMixPush.onMessage.listen((message) {
print('消息到达: $message');
});
// 6. 监听通知点击(在 Flutter 层做页面跳转)
FlutterMixPush.onNotificationClicked.listen((message) {
print('通知点击: $message');
// 解析 message.payload 中的路由参数并跳转
});
// 7. 主动获取 regId(60 秒超时)
final platform = await FlutterMixPush.getRegisterId();
Dart API
| 方法 | 说明 |
|---|---|
FlutterMixPush.register({defaultPlatform}) |
初始化并注册推送 |
FlutterMixPush.getRegisterId() |
异步获取 regId / token |
FlutterMixPush.requestPermission() |
申请通知权限 |
FlutterMixPush.getLaunchMessage() |
获取冷启动点击消息(获取后自动清除) |
FlutterMixPush.onRegisterSucceed |
注册成功事件流 |
FlutterMixPush.onMessage |
通知栏消息到达事件流 |
FlutterMixPush.onNotificationClicked |
通知栏消息点击事件流 |
消息模型 MixPushMessage:platform(mi/huawei/honor/oppo/vivo/meizu/apns)、title、description、payload(业务自定义,建议 JSON 字符串,用于 Flutter 层跳转)。
Android 配置
在 example/android/app/build.gradle.kts 的 defaultConfig 中配置各厂商 Key(未配置的厂商自动跳过注册,不影响其他厂商):
defaultConfig {
manifestPlaceholders["MI_APP_ID"] = "小米推送 AppId"
manifestPlaceholders["MI_APP_KEY"] = "小米推送 AppKey"
manifestPlaceholders["MEIZU_APP_ID"] = "魅族推送 AppId"
manifestPlaceholders["MEIZU_APP_KEY"] = "魅族推送 AppKey"
manifestPlaceholders["OPPO_APP_KEY"] = "OPPO 推送 AppKey"
manifestPlaceholders["OPPO_APP_SECRET"] = "OPPO 推送 AppSecret"
manifestPlaceholders["VIVO_APP_ID"] = "vivo 推送 AppId"
manifestPlaceholders["VIVO_APP_KEY"] = "vivo 推送 AppKey"
// 华为推送 AppId(AppGallery Connect 创建应用获取),无需 agconnect-services.json
manifestPlaceholders["HUAWEI_APP_ID"] = "华为 AppId"
// 荣耀推送 AppId(荣耀开发者服务平台创建应用获取),无需 mcs-services.json
manifestPlaceholders["HONOR_APP_ID"] = "荣耀 AppId"
}
各厂商 Key 申请:小米开放平台 / 华为 AppGallery Connect / 荣耀开发者服务平台 / OPPO 开放平台 / vivo 开放平台 / 魅族 Flyme 推送。
荣耀推送专项说明(AppId 申请:荣耀开发者服务平台 > 应用服务 > 推送服务):
-
仅支持荣耀品牌设备(国内 MagicOS 4.0 及以上),未配置
HONOR_APP_ID时自动跳过注册,不影响其他厂商。 -
必须使用正式签名包调试/发布(debug 签名无法注册成功),并需在荣耀后台配置应用的 SHA256 证书指纹。
-
无需
mcs-services.json与 asplugin 插件,AppId 直接写入 Manifest 的com.hihonor.push.app_id,由 SDK 从 meta-data 读取。 -
通知点击跳转:服务端下发时配置
clickAction.type = 1自定义 intent,跳转地址格式:mixpush://com.mixpush.honor/message?title=title&description=description&payload=payload
iOS 配置
- 在 Xcode 中打开
example/ios/Runner.xcworkspace,Target 的 Signing & Capabilities 添加 Push Notifications 能力(自动生成aps-environmententitlement)。 - 在 Apple Developer 后台创建 APNs 证书/密钥,配置到你的推送服务端。
- 无需修改
AppDelegate.swift,插件自动注册UNUserNotificationCenterDelegate并桥接所有事件。
推送源码结构
推送核心与各厂商实现统一位于插件模块 android/src/main/kotlin/com/mixpush/ 下,按厂商文件夹分区(类名/包名保持不变,MixPushClient 通过反射按类名注册厂商 Provider):
com/mixpush/
├── core/ # 核心:MixPushClient 注册分发、MixPushReceiver 回调、消息模型
├── mi/ # 小米推送(SDK 7.9.2,libs 本地 jar)
├── meizu/ # 魅族推送(SDK 5.0.3)
├── oppo/ # OPPO 推送(SDK 3.7.1,libs 本地 jar)
├── vivo/ # vivo 推送(SDK 4.1.3.0,libs 本地 jar)
├── huawei/ # 华为推送(SDK 6.13.0.301,无需 agconnect-services.json)
└── honor/ # 荣耀推送(SDK 7.0.61.303,无需 mcs-services.json)
厂商 SDK 依赖:小米/OPPO/vivo 为本地 jar(android/libs/),华为/荣耀走官方 maven 仓库,魅族走 Maven Central。
接入其他 Android 工程:复制 android/src/main/kotlin/com/mixpush/ 与 android/libs/,声明相应厂商依赖,调用方式与 MixPush 一致:
MixPushClient.getInstance().setPushReceiver(object : MixPushReceiver() {
override fun onRegisterSucceed(context: Context, platform: MixPushPlatform) {
// 上报 regId 到服务端
}
override fun onNotificationMessageClicked(context: Context, message: MixPushMessage) {
// 处理通知点击跳转
}
})
MixPushClient.getInstance().register(applicationContext, "mi")
构建环境
- Gradle 8.14(wrapper 已配置腾讯镜像加速)
- Android Gradle Plugin 8.11.1
- Kotlin 2.2.20
- compileSdk 36 / minSdk 21 / JVM 17
说明
- 已移除 MixPush 的透传(passThrough)能力,仅保留通知栏推送。
- 华为推送不再依赖
agconnect-services.json与 agcp 插件,通过HUAWEI_APP_ID手动指定 AppId。 - 荣耀推送不再依赖
mcs-services.json与 asplugin 插件,通过com.hihonor.push.app_id手动指定 AppId(荣耀 SDK 直接从 meta-data 读取)。 - Android 13+ 需要运行时申请通知权限(插件
requestPermission已封装)。 - 通知点击后 App 进程被杀的场景:插件会缓存点击消息,Flutter 启动后通过
getLaunchMessage()补发。
License
Apache License 2.0。本插件基于 MixPush(Apache-2.0)改造。