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

安卓设备通过PHP调用Firebase无法接收通知的技术求助

我来帮你一步步排查FCM通知无法送达的问题,结合你提到的各个组件来分析可能的卡点:

一、Token存储与用户关联的核心问题

你的流程里Token是APP点击按钮时通过insert.php存入数据库,但这一步很容易出关联错误:

  • Token有没有和目标用户/组绑定?
    如果数据库里只存了Token,没关联对应的用户ID或组ID,后续PHP发通知时根本找不到要发送的目标。一定要确保插入时把Token和用户/组标识一起存入,比如数据库表要有user_id/group_id字段和fcm_token字段关联。
  • Token是否准确同步?
    在MainActivity里打印从SharedPreference取出的Token,和数据库里存储的对比,看看有没有存错、重复存储的情况。另外,FCM Token会在APP卸载重装、设备系统更新等场景下变更,你的MyFirebaseInstanceIdServices只把新Token存到了SharedPreference,但有没有同步更新数据库里的旧Token?如果数据库里还是失效的旧Token,发通知肯定收不到。
二、PHP发送端的逻辑漏洞

这是通知无法送达的高频问题点,你可以从这几个方向检查:

  • 请求体是否针对特定用户/组构建?
    发送单个用户时,要指定to字段为目标用户的Token;发送用户组时,要先从数据库取出该组所有有效Token,用registration_ids字段传递列表,示例代码如下:
    // 发送单个用户
    $payload = [
        'to' => '目标用户的FCM Token',
        'notification' => [
            'title' => '通知标题',
            'body' => '通知内容'
        ]
    ];
    
    // 发送用户组
    $groupTokens = ['Token1', 'Token2', 'Token3']; // 从数据库查询该组的Token列表
    $payload = [
        'registration_ids' => $groupTokens,
        'notification' => [
            'title' => '组通知标题',
            'body' => '组通知内容'
        ]
    ];
    
  • 服务器密钥是否正确?
    检查PHP请求的Authorization头,必须是Authorization: key=你的Firebase服务器密钥,密钥要从Firebase控制台的「项目设置」→「云消息传递」里获取,别混淆成Web API密钥或其他密钥。
  • 有没有处理FCM返回的错误?
    发送请求后一定要打印返回结果,比如如果Token无效,FCM会返回InvalidRegistration错误,这时候要及时从数据库删除无效Token,避免后续重复发送无效请求。
三、Android端通知接收与显示的问题

你的MyFirebaseMessagingService负责处理通知,要确保这部分逻辑没问题:

  • 服务注册是否正确?
    检查MyFirebaseMessagingService是否正确继承FirebaseMessagingService,并且在AndroidManifest.xml里注册:
    <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    
  • 通知通道是否配置?
    Android 8.0及以上必须创建通知通道才能显示通知,你需要在MyFirebaseMessagingService里添加通道创建代码:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel("custom_channel", "自定义通知通道", NotificationManager.IMPORTANCE_DEFAULT);
        NotificationManager manager = getSystemService(NotificationManager.class);
        if (manager != null) {
            manager.createNotificationChannel(channel);
        }
    }
    
    并且构建通知时指定通道ID:
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "custom_channel")
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(title)
            .setContentText(message)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    
  • 后台接收逻辑是否适配?
    如果APP在后台,FCM的notification字段消息会由系统托盘直接处理,不会走到onMessageReceived方法;如果需要后台也自定义处理,要改用data字段发送消息,这样不管前台后台都会触发onMessageReceived。
四、其他容易忽略的细节
  • 权限与依赖检查:确认AndroidManifest.xml里添加了网络权限<uses-permission android:name="android.permission.INTERNET" />,并且app级build.gradle里的Firebase依赖版本是稳定版,比如com.google.firebase:firebase-messaging:24.0.0(可以用最新稳定版)。
  • 测试环境适配:如果是Debug版本测试,要确保Firebase控制台里添加了Debug签名的SHA-1值,否则可能无法正常接收通知。

内容的提问来源于stack exchange,提问作者Om Prakash Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:18:38