huawei_push_plus 1.0.0
huawei_push_plus: ^1.0.0 copied to clipboard
华为推送服务的Flutter插件,专为华为设备设计,提供完整的HMS Push Kit集成,包括原生Badge功能。
huawei_push #
华为推送服务的Flutter插件,专为华为设备设计,提供完整的HMS Push Kit集成,支持在华为设备上接收和处理推送消息,包括原生Badge功能。
🚀 快速开始 #
1. 添加依赖 #
dependencies:
huawei_push: ^0.0.1
2. 必需配置 #
下载配置文件
从华为开发者控制台下载 agconnect-services.json
文件,放置到 android/app/
目录下。
项目级 build.gradle.kts
buildscript {
repositories {
google()
mavenCentral()
maven { url = uri("https://developer.huawei.com/repo/") }
}
dependencies {
classpath("com.huawei.agconnect:agcp:1.5.2.300")
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url = uri("https://developer.huawei.com/repo/") }
}
}
应用级 build.gradle.kts
plugins {
id("com.android.application")
id("kotlin-android")
id("dev.flutter.flutter-gradle-plugin")
// 必需:手动添加AGConnect插件
id("com.huawei.agconnect")
}
3. 开始使用 #
import 'package:huawei_push/huawei_push.dart';
// 初始化
await HuaweiPush.initialize();
// 获取Token
String? token = await HuaweiPush.getToken();
// 监听消息
HuaweiPush.onMessageReceived.listen((message) {
print('收到推送: ${message.title}');
});
✅ 插件会自动处理权限、服务和其他配置,只需手动配置华为Maven仓库、AGConnect插件和配置文件!
📱 专为华为设备优化,支持原生Badge功能!
功能特性 #
- ✅ 华为推送服务初始化
- ✅ 获取和管理推送Token
- ✅ 订阅和取消订阅主题
- ✅ 接收推送消息
- ✅ 处理消息点击事件
- ✅ 通知渠道管理
- ✅ 应用图标Badge管理(华为设备专用)
- ✅ 自动Badge计数
- ✅ 华为设备原生Badge支持
Badge功能 #
应用图标上的红点(Badge)功能,专为华为设备设计:
自动Badge管理 #
- 收到推送消息时自动增加badge数量
- 用户点击通知时自动清除badge
- 应用启动时自动清除badge
手动Badge管理 #
// 设置badge数量
bool success = await HuaweiPush.setBadgeCount(5);
// 获取当前badge数量
int count = await HuaweiPush.getBadgeCount();
// 增加badge数量
int newCount = await HuaweiPush.incrementBadgeCount(increment: 3);
// 减少badge数量
int newCount = await HuaweiPush.decrementBadgeCount(decrement: 2);
// 清除badge
bool success = await HuaweiPush.clearBadge();
Badge变化监听 #
// 监听badge数量变化
HuaweiPush.onBadgeCountChanged.listen((count) {
print('Badge数量变化: $count');
// 更新UI显示
});
Badge使用场景 #
- 未读消息计数:显示未读消息数量
- 待处理任务:显示待处理任务数量
- 系统通知:显示系统通知数量
- 自定义计数:根据业务需求自定义计数
设备支持 #
- 华为设备:使用华为原生Launcher API,支持度最佳
- 通知badge:所有设备都支持通知栏中的数字显示
完整示例 #
安装 #
在 pubspec.yaml
文件中添加依赖:
dependencies:
huawei_push: ^0.0.1
配置 #
Android配置 #
本插件支持部分自动配置,但某些关键配置仍需手动处理。
1. 必需配置
下载配置文件
从华为开发者控制台下载 agconnect-services.json
文件,并放置到 android/app/
目录下。
项目级 build.gradle.kts(必需)
buildscript {
repositories {
google()
mavenCentral()
// 必需的华为Maven仓库
maven { url = uri("https://developer.huawei.com/repo/") }
}
dependencies {
// 必需的AGConnect插件
classpath("com.huawei.agconnect:agcp:1.5.2.300")
}
}
allprojects {
repositories {
google()
mavenCentral()
// 必需的华为Maven仓库
maven { url = uri("https://developer.huawei.com/repo/") }
}
}
应用级 build.gradle.kts(必需)
plugins {
id("com.android.application")
id("kotlin-android")
id("dev.flutter.flutter-gradle-plugin")
// 必需:手动添加AGConnect插件
id("com.huawei.agconnect")
}
2. 自动配置 vs 手动配置
配置项 | 自动配置 | 手动配置 |
---|---|---|
华为Maven仓库 | ❌ 无法自动添加 | ✅ 必需手动添加 |
AGConnect插件(项目级) | ❌ 无法自动添加 | ✅ 必需手动添加 |
AGConnect插件(应用级) | ❌ 无法自动添加 | ✅ 必需手动添加 |
AGConnect依赖 | ✅ 自动添加 | ❌ 无需手动添加 |
推送权限 | ✅ 自动添加 | ❌ 无需手动添加 |
推送服务 | ✅ 自动添加 | ❌ 无需手动添加 |
agconnect-services.json | ❌ 无法自动添加 | ✅ 必需手动添加 |
注意:由于Flutter插件架构限制,华为Maven仓库和AGConnect插件无法完全自动化配置。
3. 最小化配置方案
只需手动配置以下3项:
- 项目级 build.gradle.kts - 添加华为Maven仓库和AGConnect插件
- 应用级 build.gradle.kts - 添加AGConnect插件
- agconnect-services.json - 下载并放置配置文件
其他所有配置(权限、服务、依赖)都会自动处理。
4. 版本要求
- compileSdk: 35 或更高
- minSdk: 21 或更高
- Java版本: 11
- Kotlin版本: 1.8.22 或更高
5. 测试验证
✅ 已验证功能:
- 华为推送服务初始化成功
- 成功获取AAID:
6a974dc0-3d1f-4bc8-a01b-82bda23a6d66
- 成功获取推送Token:
0869158020925737300028618400CN01
- Token刷新回调正常工作
- 推送消息接收正常
6. 注意事项
- 确保应用包名与华为开发者控制台配置一致
- 确保SHA256证书指纹与华为开发者控制台配置一致
- 在华为设备上测试推送功能
- 某些设备可能需要禁用"纯净模式"才能正常安装和运行应用
- 关键:必须下载并正确放置
agconnect-services.json
文件,否则Token获取会失败 - 关键:必须在应用级
build.gradle.kts
中手动添加AGConnect插件 - 自动配置优势:
- 减少大部分手动配置工作
- 自动检测并避免重复配置
- 构建时会显示配置日志,便于调试
详细配置步骤请参考 华为推送集成指南。
使用方法 #
基础设置 #
import 'package:huawei_push/huawei_push.dart';
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
_initHuaweiPush();
}
Future<void> _initHuaweiPush() async {
// 初始化华为推送服务
await HuaweiPush.initialize();
// 获取推送Token
String? token = await HuaweiPush.getToken();
print('推送Token: $token');
// 监听推送消息
HuaweiPush.onMessageReceived.listen((HuaweiPushMessage message) {
print('收到推送消息: ${message.title}');
});
// 监听Token刷新
HuaweiPush.onTokenRefresh.listen((HuaweiPushToken token) {
print('Token已刷新: ${token.token}');
});
// 监听消息点击
HuaweiPush.onMessageClicked.listen((HuaweiPushMessage message) {
print('用户点击了消息: ${message.title}');
});
}
}
高级功能 #
// 主题订阅
await HuaweiPush.subscribe('news');
await HuaweiPush.subscribe('sports');
// 取消订阅
await HuaweiPush.unsubscribe('news');
// 控制自动初始化
await HuaweiPush.setAutoInitEnabled(false);
bool isEnabled = await HuaweiPush.isAutoInitEnabled();
// 创建通知渠道
await HuaweiPush.createNotificationChannel(
channelId: 'important',
channelName: '重要通知',
channelDescription: '重要消息通知',
importance: 4,
enableLights: true,
enableVibration: true,
);
// 删除通知渠道
await HuaweiPush.deleteNotificationChannel('important');
// 获取设备信息
String? aaid = await HuaweiPush.getAAID();
String? odid = await HuaweiPush.getODID();
String? creationTime = await HuaweiPush.getCreationTime();
// 获取初始消息(应用通过推送启动时)
HuaweiPushMessage? initialMessage = await HuaweiPush.getInitialMessage();
if (initialMessage != null) {
print('应用通过推送启动: ${initialMessage.title}');
}
// 删除Token
await HuaweiPush.deleteToken();
数据模型 #
// 推送消息模型
class HuaweiPushMessage {
final String? messageId;
final String? messageType;
final String? title;
final String? body;
final Map<String, dynamic>? data;
final String? notificationId;
final String? notificationTag;
final String? clickAction;
final String? channelId;
final String? icon;
final String? color;
final String? sound;
final int? timestamp;
}
// 推送Token模型
class HuaweiPushToken {
final String token;
final int timestamp;
final String? tokenType;
}
完整示例 #
import 'package:flutter/material.dart';
import 'package:huawei_push/huawei_push.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _pushToken = 'No token';
bool _isInitialized = false;
final List<HuaweiPushMessage> _messages = [];
@override
void initState() {
super.initState();
_initializePush();
_setupListeners();
}
Future<void> _initializePush() async {
try {
final result = await HuaweiPush.initialize();
setState(() {
_isInitialized = result;
});
if (result) {
await _getToken();
}
} catch (e) {
print('初始化失败: $e');
}
}
Future<void> _getToken() async {
try {
final token = await HuaweiPush.getToken();
setState(() {
_pushToken = token ?? 'Failed to get token';
});
} catch (e) {
print('获取Token失败: $e');
}
}
void _setupListeners() {
// 监听推送消息
HuaweiPush.onMessageReceived.listen((HuaweiPushMessage message) {
print('收到推送消息: ${message.title}');
setState(() {
_messages.add(message);
});
});
// 监听Token刷新
HuaweiPush.onTokenRefresh.listen((HuaweiPushToken token) {
print('Token已刷新: ${token.token}');
setState(() {
_pushToken = token.token;
});
});
// 监听消息点击
HuaweiPush.onMessageClicked.listen((HuaweiPushMessage message) {
print('用户点击了推送消息: ${message.title}');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '华为推送示例',
home: Scaffold(
appBar: AppBar(title: const Text('华为推送示例')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('初始化状态: ${_isInitialized ? '成功' : '失败'}'),
Text('推送Token: $_pushToken'),
Text('接收消息数: ${_messages.length}'),
],
),
),
),
);
}
}
支持平台 #
- ✅ Android (华为设备)
- ❌ iOS (华为推送服务不支持iOS)
测试环境 #
- 设备: 华为 P9 (EVA AL00)
- Android版本: 8.0
- EMUI版本: 8.0
- HMS Core版本: 6.15.0.311
- Flutter版本: 3.19.0
- 测试结果: ✅ 完全正常工作
注意事项 #
- 华为推送服务仅在华为设备上可用
- 需要在华为开发者联盟注册应用并开通推送服务
- 确保应用包名与控制台配置一致
- 在EMUI 10.0以下版本,Token可能需要通过
onTokenRefresh
流获取 - 某些设备可能需要禁用"纯净模式"才能正常安装和运行应用
- 重要: 必须按照配置要求手动添加华为Maven仓库和AGConnect插件
- 重要: 必须正确放置
agconnect-services.json
配置文件
许可证 #
MIT License