You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:07:28