You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter集成Pusher Beams后Android真机无法接收后台通知的问题求助

Flutter集成Pusher Beams后Android真机无法接收后台通知的问题求助

我之前帮不少开发者解决过类似的问题,模拟器正常但真机后台/关闭状态收不到通知,大多是Android系统(尤其是国内厂商定制系统)的限制或者配置遗漏导致的,你可以逐一排查下面这些点:


1. 确保通知渠道已实际创建

你的Manifest里配置了默认通知渠道的meta-data,但Android 8.0+要求必须在代码中主动创建通知渠道,模拟器可能会宽松处理,但真机严格执行。你需要在Flutter代码里添加创建渠道的逻辑,比如在APP启动时:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

void createNotificationChannel() async {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'app_name_channel', // 和Manifest里的channel_id完全一致
    'App Notifications',
    description: 'Channel for app notifications',
    importance: Importance.max,
  );
  await flutterLocalNotificationsPlugin.createNotificationChannel(channel);
}

main函数里调用这个方法,确保渠道在APP启动时就已创建。

2. 检查Pusher Beams的推送Payload格式

Pusher Beams底层依赖FCM,后台发送通知时要注意Payload的结构:

  • 如果是系统自动显示的通知:必须包含android.notification字段,并且指定正确的channel_id(和你创建的渠道ID一致)
  • 如果是需要自定义处理的数据消息:要确保你注册的onBackgroundMessage回调是顶级函数(不能是类的成员方法),否则后台状态下无法触发回调,自然收不到通知。

比如在Pusher控制台发送时,Payload应该类似:

{
  "interests": ["your-target-interest"],
  "android": {
    "notification": {
      "title": "后台测试通知",
      "body": "这是一条后台通知",
      "channel_id": "app_name_channel"
    }
  }
}

3. 处理国内厂商的后台限制(最常见原因)

国内Android厂商(小米、华为、OPPO、vivo等)有自己的后台管理机制,即使关闭了电池优化,也可能会杀死APP进程,导致Pusher Beams的推送服务无法运行。你需要引导用户在设备设置里做以下配置:

  • 允许自启动:在APP的权限设置里开启“自启动”权限(比如小米的「应用设置」→「权限管理」→「自启动」)
  • 无限制后台活动:设置APP的后台活动为“无限制”(比如华为的「启动管理」设为「手动管理」,并勾选「允许后台活动」)
  • 锁定APP到后台:在最近任务列表里,长按APP图标选择「锁定」,防止被系统自动清理
  • 加入电池白名单:部分厂商需要额外在「省电模式」里把APP加入白名单,避免被后台查杀

4. 确认发布版的签名指纹配置正确

如果你测试的是Release构建,要确保Firebase控制台里已经添加了Release版的SHA-1/SHA-256指纹。Pusher Beams依赖FCM,而FCM会验证APP的签名指纹,Release版和Debug版的签名不同,如果没添加Release指纹,FCM会直接拒绝推送请求。

你可以通过以下命令获取Release版签名指纹:

keytool -list -v -keystore your-release-keystore.jks -alias your-alias

把获取到的指纹添加到Firebase控制台的项目设置里,重新下载google-services.json替换到项目中。

5. 检查Pusher Beams的初始化逻辑

确保你在Flutter的main函数里正确初始化了Pusher Beams,并且注册了后台消息回调:

  • 后台回调必须是顶级函数,示例代码如下:
// 必须是顶级函数,不能放在类里面
Future<void> backgroundMessageHandler(Map<String, dynamic> message) async {
  // 这里可以处理后台消息,比如显示自定义通知
  print('Received background message: $message');
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await PusherBeams.instance.start(
    instanceId: 'your-instance-id',
    onBackgroundMessage: backgroundMessageHandler,
  );
  // 别忘了创建通知渠道
  createNotificationChannel();
  runApp(MyApp());
}

如果回调不是顶级函数,后台状态下不会触发,导致通知无法显示。

6. 验证设备令牌的注册状态

在真机上,打开APP后,打印Pusher Beams的设备令牌,确认令牌已经成功注册到Pusher控制台。有时候真机的网络环境(比如企业WiFi的代理)可能导致注册失败,你可以在代码里监听注册状态:

PusherBeams.instance.onDeviceRegistered.listen((deviceId) {
  print('Device registered with ID: $deviceId');
});

如果没有收到注册回调,说明设备没有成功和Pusher Beams建立连接,需要检查网络和初始化配置。


另外,你可以尝试用FCM直接发送测试通知,排除Pusher Beams的问题:如果FCM能在后台收到,那问题出在Pusher Beams的配置;如果FCM也收不到,那就是Android系统的限制或者FCM配置问题。

按照上面的步骤逐一排查,应该能解决大部分真机后台通知的问题,如果还有疑问,可以把测试过程中的日志(比如Pusher Beams的初始化日志、FCM的日志)贴出来,方便进一步排查。

火山引擎 最新活动