flutter_mix_push

pub package

基于 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 通知栏消息点击事件流

消息模型 MixPushMessageplatform(mi/huawei/honor/oppo/vivo/meizu/apns)、titledescriptionpayload(业务自定义,建议 JSON 字符串,用于 Flutter 层跳转)。

Android 配置

example/android/app/build.gradle.ktsdefaultConfig 中配置各厂商 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 配置

  1. 在 Xcode 中打开 example/ios/Runner.xcworkspace,Target 的 Signing & Capabilities 添加 Push Notifications 能力(自动生成 aps-environment entitlement)。
  2. 在 Apple Developer 后台创建 APNs 证书/密钥,配置到你的推送服务端。
  3. 无需修改 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)改造。