当应用程序处于前台时,Firebase onMessageReceived未被调用

我已经清楚地阅读了很多关于firebase推送通知行为的文档。 我可以在我的应用程序处于后台时看到系统托盘上的通知,但是当应用程序处于前台时,不会触发 onMessageReceived </ code>回调。 我可以看到我的应用程序收到消息的日志。 我尝试使用数据有效负载进行调用,并且没有来自应用服 我的app服务器使用php脚本来触发fcm apis。 以下是我正在使用的php脚本</ p>

  $ url ='https://fcm.googleapis.com/fcm/send'; 
$ fields = array(\ n'registration_ids'=&gt; $ registatoin_ids,
'notification'=&gt; array(“title”=&gt; $ title,“body”=&gt; $ notification_message,“click_action”=&gt; $ click_action,'color' =&gt;“#74BCEE”,“icon”=&gt;“school_logo”));
$ headers = array(
'授权:key ='xxxxxxxxx',
'内容类型:application / json'\ n);

//打开连接
$ ch = curl_init();

// echo“here”;退出;
//设置网址,POST数量,POST数据
curl_setopt($ ch,CURLOPT_URL,$ url);

curl_setopt($ ch,CURLOPT_POST,true);
curl_setopt($ ch,CURLOPT_HTTPHEADER,$ headers);
curl_setopt($ ch,CURLOPT_RETURNTRANSFER,true);

//暂时禁用SSL证书支持
curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false);

curl_setopt($ ch,CURLOPT_POST) FIELDS,json_encode($ fields));

//执行post
$ result = curl_exec($ ch);
if($ result === FALSE){
// die('Curl failed: '。 curl_error($ ch));
curl_close($ ch);
return;

}
print_r($ result);
</ code> </ pre>

关注 是我在Android应用程序中使用的服务</ p>

 &lt; service 
android:name =“service.MyFirebaseMessagingService”&gt;
&lt; intent-filter&gt; \ n&lt; action android:name =“com.google.firebase.MESSAGING_EVENT”/&gt;
&lt; / intent-filter&gt;
&lt; / service&gt;

&lt; service
android:name =“service。 MyFirebaseInstanceIdService“&gt;
&lt; intent-filter&gt;
&lt; action android:name =”com.google.firebase.INSTANCE_ID_EVENT“/&gt;
&lt; / intent-filter&gt;
&lt; / service&gt;
</ code> </ pre>
</ div>

展开原文

原文

I have read much documents regarding firebase push notification behaviour clearly. I'm able to see notification on the system tray when my app is in background but not triggering onMessageReceivedcall back when app is in foreground. I can see the logs that the message is received on my app. I have tried calling with data payload and without data payload from app server. My app server is using php script to trigger the fcm apis. Following is the php script I'm using

  $url = 'https://fcm.googleapis.com/fcm/send';
  $fields = array(
            'registration_ids' => $registatoin_ids,
     'notification' => array( "title"=>$title, "body" => $notification_message ,"click_action"  => $click_action,'color' => "#74BCEE",'icon' => "school_logo"));
      $headers = array(
            'Authorization: key='xxxxxxxxx',
            'Content-Type: application/json'
        );

        // Open connection
        $ch = curl_init();

        //echo "here";exit;
        // Set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // Disabling SSL Certificate support temporarly
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

        // Execute post
        $result = curl_exec($ch);
        if ($result === FALSE) {
            //die('Curl failed: ' . curl_error($ch));
            curl_close($ch);
            return;

        }
        print_r($result);

Following are the services i'm using in my Android app

    <service
    android:name="service.MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

<service
    android:name="service.MyFirebaseInstanceIdService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

doudong7256
doudong7256 通过Firebase文档firebase.google.com/docs/cloud-messaging/concept-options当应用在后台时,通知邮件会传递到通知托盘。对于前台的应用程序,消息由Android上的回调onMessageReceived()处理。数据包中的通知密钥包含通知。
3 年多之前 回复
dscojuxf69080
dscojuxf69080 也许在问题中添加FirebaseMessagingService会有所帮助。
大约 4 年之前 回复
dptsivmg82908
dptsivmg82908 我的项目文件夹结构不像main->java->com->appname,它是java->activites,java->service。所以在这种情况下,我可以将包名称指向“。”。因为它不在根文件夹中。服务工作正常,否则我应该没有fcm令牌或背景消息。感谢您的评论
大约 4 年之前 回复
dongshi9407
dongshi9407 你什么意思?名称必须以“。”开头。如果它们是相对于包名称,或者应该包含完整的包名称
大约 4 年之前 回复
douzhenyu6533
douzhenyu6533 我已将包名重组为单个文件夹,以便我可以直接使用服务。在清单文件中。
大约 4 年之前 回复
douji0073
douji0073 我尝试将通知和数据有效负载一起发送。在有和没有数据有效负载的情况下,当app在前台时,不会调用onMessageReceived。我可以在FirebaseMessagingService中看到收到消息的日志
大约 4 年之前 回复
dppcyt6157
dppcyt6157 我怀疑问题出在你的AndroidManifest.xml中。尝试用“.service.MyFirebaseInstanceIdService”替换“service.MyFirebaseInstanceIdService”(注意开头的点)。请参阅developer.android.com/guide/topics/manifest/中的“android:name”部分。
大约 4 年之前 回复
douhuang5331
douhuang5331 当你说你尝试使用数据有效负载时,你的意思是你用PHP代码中的JSON中的数据替换了通知字段吗?即使你的应用程序处于前台,你的onMessageReceived方法也没有被调用?
大约 4 年之前 回复

1个回答



我遇到了同样的问题。 我的问题是&lt; service&gt;&lt; / service&gt; </ code>
tags不在清单文件中的&lt; application&gt;&lt; / application&gt; </ code>标记之外。 当我输入&lt; application&gt;&lt; / application&gt; </ code>标记时,问题就解决了。</ p>
</ div>

展开原文

原文

I had the same problem. My problem was that the <service></service> tags were outside the <application></application> tag in the manifest file. When I put in the <application></application> tag, the problem was solved.

douzhannao5357
douzhannao5357 生命保护。 希望我早些发现这个。
2 年多之前 回复
duanchi8836
duanchi8836 我真的为此疯狂,多次检查应用程序,切换到不同的模拟器。 但是谢谢你救了我的一天。
大约 3 年之前 回复
douyan8961
douyan8961 这为我解决了这个问题。 谢谢@Jamal
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐