Flutter中如何通过Rest API实现推送通知?无需Firebase的完整实现流程咨询
不用Firebase实现Flutter推送通知(基于Rest API触发)
当然可以不用Firebase实现这个需求!我来给你梳理一套完整的落地流程,亲测可行~
核心思路
整体逻辑很清晰:当你的Rest API收到新数据时,调用第三方推送服务的API(替代Firebase Cloud Messaging),然后Flutter客户端集成该推送服务的SDK,就能接收并处理通知了。我们用OneSignal举例子(免费额度足够个人/小团队开发,配置也相对简单)。
完整实现步骤
1. 选一个非Firebase的推送服务
推荐这些成熟的第三方服务:
- OneSignal(最常用,支持多平台,免费版够用)
- Pusher Beams
- Airship
这里以OneSignal为例展开,其他服务的流程大同小异。
2. 配置推送服务平台
- 注册OneSignal账号,创建新应用,记下你的
App ID和REST API Key(在应用设置里能找到) - 针对iOS和Android分别做平台配置:
- Android:不用依赖Firebase,OneSignal有自己的推送通道。按照官方步骤,在你的Flutter Android项目里添加权限、配置清单文件(OneSignal会给出具体的代码片段,直接复制粘贴就行)
- iOS:需要在Apple开发者后台生成APNs证书,然后上传到OneSignal的应用配置里,这一步是iOS推送的必备操作,和Firebase的要求类似,但不需要Firebase账号。
3. Flutter客户端集成SDK
- 在
pubspec.yaml里添加依赖:dependencies: onesignal_flutter: ^5.0.0 # 请用最新版本 - 初始化SDK并请求权限:在
main.dart的main函数里添加:import 'package:onesignal_flutter/onesignal_flutter.dart'; import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化OneSignal await OneSignal.initialize("你的OneSignal App ID"); // 请求通知权限 await OneSignal.Notifications.requestPermission(true); // 获取设备的推送Token,传到你的后端保存 final pushToken = await OneSignal.User.pushSubscription.token; if (pushToken != null) { // 调用你的Rest API,把token存到数据库(关联用户或设备) await savePushTokenToBackend(pushToken); } runApp(const MyApp()); } // 示例:封装上传token的函数 Future<void> savePushTokenToBackend(String token) async { // 这里替换成你的后端API地址 // final response = await http.post(Uri.parse('https://your-api.com/save-token'), body: {'token': token}); } - 监听通知事件:比如处理用户点击通知的逻辑:
// 在首页或者初始化的地方添加监听 OneSignal.Notifications.addClickListener((event) { // 从通知的附加数据里获取相关信息,跳转到对应页面 final notificationData = event.notification.additionalData; if (notificationData != null && context != null) { Navigator.push( context!, MaterialPageRoute(builder: (context) => DetailPage(data: notificationData)), ); } });
4. 改造你的Rest API
当你的API收到新数据时,调用OneSignal的推送API发送通知:
- 示例(Node.js后端):
const axios = require('axios'); // 封装推送函数 async function sendPushNotification(deviceToken, title, message) { try { await axios.post('https://onesignal.com/api/v1/notifications', { app_id: '你的OneSignal App ID', include_player_ids: [deviceToken], // 用你存在数据库里的设备Token contents: { en: message }, headings: { en: title }, // 可以添加附加数据,供Flutter客户端处理 data: { type: 'new_data', content: message } }, { headers: { 'Authorization': 'Basic 你的OneSignal REST API Key', 'Content-Type': 'application/json' } }); console.log('推送发送成功'); } catch (error) { console.error('推送失败:', error); } } // 你的数据接收接口 app.post('/api/receive-data', async (req, res) => { // 处理传入的新数据 const newData = req.body; // 从数据库获取需要推送的设备Token(比如关联当前用户的token) const targetDeviceToken = await getDeviceTokenFromDB(newData.userId); // 发送推送通知 await sendPushNotification( targetDeviceToken, '新数据提醒', `你有一条新数据:${newData.title}` ); res.status(200).json({ status: 'success', message: '数据处理完成,推送已触发' }); });
5. 测试验证
- 运行Flutter App,确认设备Token已成功传到后端并保存
- 调用你的
/api/receive-data接口传入测试数据 - 检查设备是否收到推送通知,点击通知是否能正确跳转和处理
备选方案:自己搭建推送服务
如果你不想用第三方,也可以自己搭建,但复杂度会高很多:
- 可以用
web-push库实现Web Push(但移动端需要支持WebView或者特定插件) - 或者基于MQTT协议实现长连接推送,但需要处理设备在线状态、消息重试、负载均衡等问题,适合有一定后端经验的开发者。
内容的提问来源于stack exchange,提问作者Rakesh Saini
相关产品推荐
相关产品推荐

