1. 项目背景与核心价值
去年接手一个企业移动端项目时,客户要求在Android、iOS和即将发布的HarmonyOS设备上实现统一体验。当时尝试用Flutter进行鸿蒙适配,意外发现其跨平台能力在鸿蒙生态中表现优异。这次就以一个实用的生日提醒APP为例,分享完整的开发流程。
这个项目最核心的价值在于:
- 使用单一代码库同时覆盖Android、iOS和HarmonyOS三大平台
- 验证Flutter在鸿蒙系统的兼容性和性能表现
- 实现系统级后台定时通知的跨平台方案
特别说明:自HarmonyOS 3.0开始,Flutter 3.0+版本已提供官方兼容支持,但部分原生能力仍需通过平台通道实现
2. 环境配置与项目初始化
2.1 开发环境准备
我的开发机配置如下(Windows/macOS均适用):
- Flutter 3.13.0(必须≥3.7版本)
- Dart 2.18.0
- DevEco Studio 3.1作为备用IDE
- 华为P50 Pro(HarmonyOS 3.0)真机调试
bash复制# 创建项目时建议指定平台
flutter create --platforms android,ios,huawei_os birthday_reminder
2.2 鸿蒙平台特殊配置
在pubspec.yaml中需要添加这些关键依赖:
yaml复制dependencies:
flutter_local_notifications: ^15.1.1
background_fetch: ^0.8.1
hms_push: ^6.3.0 # 华为推送服务
鸿蒙特有的配置项:
- 在
android/app/src/main/AndroidManifest.xml中添加华为推送权限 - 创建
huawei_os目录结构(与android/ios同级) - 配置
agconnect-services.json文件
3. 核心功能实现
3.1 跨平台通知系统
通知功能是这类APP的核心难点,我们采用分层设计:
dart复制// 通知抽象层
abstract class NotificationService {
Future<void> scheduleBirthdayAlert(DateTime date, String personName);
}
// 鸿蒙实现
class HarmonyNotification implements NotificationService {
@override
Future<void> scheduleBirthdayAlert(DateTime date, String name) async {
// 使用HMS推送服务
await HmsPush.localNotification({
'title': '生日提醒',
'message': '今天是${name}的生日!',
'fireDate': date.millisecondsSinceEpoch,
'repeatInterval': 'yearly'
});
}
}
3.2 后台任务保活方案
测试发现不同平台的保活策略差异很大:
| 平台 | 方案 | 最长间隔 | 可靠性 |
|---|---|---|---|
| Android | WorkManager | 15分钟 | ★★★★☆ |
| iOS | Background Fetch | 30分钟 | ★★★☆☆ |
| HarmonyOS | HMS Background Task | 10分钟 | ★★★★★ |
实现代码示例:
dart复制void initBackgroundTask() {
BackgroundFetch.configure(
BackgroundFetchConfig(
minimumFetchInterval: 15, // 分钟
stopOnTerminate: false,
enableHeadless: true,
callback: _checkBirthdays
), (String taskId) async {
// 跨平台后台任务
}
);
}
4. 数据存储与同步
4.1 本地数据库选型
考虑鸿蒙的文件系统特性,最终选择Hive而非SQLite:
dart复制class BirthdayRepository {
final Box<Birthday> _box;
Future<void> addBirthday(Birthday birthday) async {
await _box.put(birthday.id, birthday);
}
// 支持农历转换的查询方法
List<Birthday> getUpcomingBirthdays() {
return _box.values.where((b) =>
b.getNextDate().difference(DateTime.now()).inDays <= 7
).toList();
}
}
4.2 多端同步方案
通过华为云函数实现跨设备同步:
- 用户登录华为账号
- 数据自动加密上传至CloudDB
- 其他设备通过监听数据库变更实现实时同步
dart复制void syncWithCloud() {
final cloudDB = CloudDBZone.open(
CloudDBZoneConfig(
zoneName: 'BirthdayZone',
persistenceEnabled: true
)
);
// 数据变更监听
cloudDB.subscribeSnapshot((snapshot) {
_updateLocalData(snapshot);
});
}
5. 界面开发技巧
5.1 自适应UI设计
针对鸿蒙的折叠屏设备特别优化:
dart复制LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > 600) {
return _buildTabletLayout(); // 双栏布局
} else {
return _buildPhoneLayout();
}
},
)
5.2 平台特定UI组件
通过Platform.isHarmony判断运行环境:
dart复制AppBar(
title: Text('生日提醒'),
actions: [
if (Platform.isHarmony)
HarmonyShareButton(), // 鸿蒙特有的分享组件
IconButton(...),
],
)
6. 测试与优化
6.1 鸿蒙专项测试项
- 卡片服务测试:验证桌面快捷卡片的点击响应
- 原子化服务测试:检查其他应用调用的兼容性
- 多设备协同测试:手机与平板的任务流转
6.2 性能优化要点
内存优化方案对比:
| 优化手段 | Android效果 | Harmony效果 |
|---|---|---|
| 图片缓存 | 提升15% | 提升22% |
| Isolate计算 | 有效 | 更有效 |
| 列表懒加载 | 必须 | 必须 |
| 减少Platform调用 | 一般 | 关键 |
7. 上架与分发
7.1 鸿蒙应用打包
不同于Android的打包流程:
bash复制flutter build huawei_os
# 生成.app文件需要经过AppGallery Connect签名
7.2 多平台发布策略
建议的发布顺序:
- 先上架华为应用市场(含HarmonyOS专属标签)
- 再发布Google Play和App Store
- 最后推送Web版(如需)
8. 实际踩坑记录
-
农历计算问题:
- 发现
flutter_chinese_lunar插件在鸿蒙上有时区bug - 最终改用
lunar纯Dart库解决
- 发现
-
后台唤醒限制:
- 鸿蒙对后台任务有严格限制
- 必须申请
ohos.permission.KEEP_BACKGROUND_RUNNING权限
-
推送服务差异:
- iOS需要额外配置APNs证书
- 鸿蒙必须集成HMS Core
- 需要编写三层推送适配代码
这个项目最让我意外的是鸿蒙平台的表现——在通知送达率和后台任务稳定性上,实测结果优于Android系统。特别是在搭载HarmonyOS 3.0的设备上,即使应用被清理,定时任务仍能可靠执行。