Flutter中基于SQFlite的后台更新定时本地通知实现咨询
Flutter 每日定时推送本地名言实现方案
所需依赖
都是Flutter生态内长期维护的稳定包,无需额外对接第三方服务:
- 本地通知能力:
flutter_local_notifications,支持安卓、iOS全平台的本地通知创建、定时、取消操作 - 后台任务调度:
workmanager,实现应用未打开状态下的后台代码执行,用来更新待推送的名言内容 - 本地存储你已经在用SQFlite,无需额外替换,后台任务可以直接访问同一份数据库文件
核心实现步骤
1. 权限配置
- 安卓端在
AndroidManifest.xml中添加如下权限:- 通知权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 后台唤醒权限:
<uses-permission android:name="android.permission.WAKE_LOCK" /> - 开机自启权限(可选,提升后台任务存活率):
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- 通知权限:
- iOS端在
Info.plist中添加通知权限、后台刷新权限声明,同时开启Xcode项目的Background Modes里的Background fetch选项
2. 基础能力初始化
应用首次启动时完成两个初始化操作:
- 调用
flutter_local_notifications的授权方法,向用户申请通知展示权限,同时配置安卓通知渠道、iOS通知展示参数,配置通知点击跳转逻辑 - 初始化
workmanager,注册一个周期为24小时的后台执行任务,可设置任务的触发窗口为你期望推送时间的前15分钟,预留内容更新时间
3. 后台任务逻辑
后台任务的回调函数中实现如下逻辑:
- 访问SQFlite数据库,随机筛选一条未推送过的名言记录
- 调用
flutter_local_notifications的定时通知接口,将筛选出的名言内容填入通知标题、正文,设置触发时间为你期望的推送时点(比如每天早上8点) - 将本条名言在数据库中标记为已推送,避免重复推送;如果所有名言都已推送过,批量重置所有记录的推送标记,重新开始轮播
4. 稳定性补充
- 应用每次前台启动时,校验后台任务是否存活、已注册的待触发通知是否正常,若被系统清理则自动重新注册,避免推送断更
- 如果用户手动修改了推送时间,先取消所有已注册的后台任务和待触发通知,再按新的时间重新注册即可
踩坑提示
- 安卓国内厂商普遍有严格的后台电量限制,小米、华为、vivo等机型可以加引导页,引导用户将应用加入系统电池优化白名单,可大幅提升推送到达率
- iOS后台刷新的触发时间由系统调度,无法保证100%准时,如果对推送时间精度要求极高,可以选择一次性注册未来7天的所有通知,每次应用打开时更新后续待推送的通知内容,双重保障不会断更
- 后台线程访问SQFlite时要确保用单例数据库实例,避免多线程同时读写触发数据库锁报错
内容的提问来源于stack exchange,提问作者AliZ.ece
相关产品推荐
相关产品推荐

