Firebase消息在设备上接收,但不会通过通知显示

I'm trying to integrate Firebase Cloud Messaging (I use this code, which is mirrored here) with my existing app.

Relevant codes:

service.php

$msg_id = $_POST['id'];
$title = $_POST['title'];
$content = $_POST['content'];
$msg_date = $_POST['date'];
$author = $_POST['author'];

// insert the message into DB               
$sql = "INSERT INTO tbl_message(msg_id, title, content, msg_date, author) VALUES ('$msg_id','$title','$content','$msg_date','$author')";

if ($result = mysqli_query($db, $sql)){

    $firebase = new Firebase();
    $push = new Push();

    $payload = array();
    $payload['foo'] = '123';
    $payload['bar'] = 'xyz';

    $push->setTitle($title);
    $push->setMessage($content);
    $push->setAuthor($author);
    $push->setDate($msg_date);
    $push->setImage('');
    $push->setPayload($payload);
    $push->setIsBackground(FALSE);
    $resp = '';
    $response = '';
    $resp = $push->getPush();
    $response = $firebase->sendToTopic('global', $resp);

    echo $response;
}

Firebase.php

<?php


class Firebase {

    // sending push message to single user by firebase reg id
    public function send($to, $message) {
        $fields = array(
            'to' => $to,
            //'data' => $message,
            'data' => array("message" => $message));

        return $this->sendPushNotification($fields);
    }

    // Sending message to a topic by topic name
    public function sendToTopic($to, $message) {
        $fields = array(
            'to' => '/topics/' . $to,
            //'data' => $message,
            'data' => array("message" => $message)
        );
        return $this->sendPushNotification($fields);
    }

    // sending push message to multiple users by firebase registration ids
    public function sendMultiple($registration_ids, $message) {
        $fields = array(
            'to' => $registration_ids,
            //'data' => $message,
            'data' => array("message" => $message)
        );

        return $this->sendPushNotification($fields);
    }

    // function makes curl request to firebase servers
    private function sendPushNotification($fields) {

        require_once 'config.php';

        // Set POST variables
        $url = 'https://fcm.googleapis.com/fcm/send';

        $headers = array(
            'Authorization: key=' . FIREBASE_API_KEY,
            'Content-Type: application/json'
        );
        // Open connection
        $ch = curl_init();

        // 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));
        }

        // Close connection
        curl_close($ch);

        return $result;
    }
}

?>

MainActivity.java

package studio.emcorp.monitoringsiswa;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.messaging.FirebaseMessaging;


public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private static final String TAG = MainActivity.class.getSimpleName();
    private BroadcastReceiver mRegistrationBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
;

        mRegistrationBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                // checking for type intent filter
                if (intent.getAction().equals(NotificationConfig.REGISTRATION_COMPLETE)) {
                    // gcm successfully registered
                    // now subscribe to `global` topic to receive app wide notifications
                    FirebaseMessaging.getInstance().subscribeToTopic(NotificationConfig.TOPIC_GLOBAL);

                    displayFirebaseRegId();

                } else if (intent.getAction().equals(NotificationConfig.PUSH_NOTIFICATION)) {
                    // new push notification is received

                    String message = intent.getStringExtra("message");

                    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();

                    //txtMessage.setText(message);
                }
            }
        };



    @Override
    protected void onResume() {
        super.onResume();

        // register GCM registration complete receiver
        LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver,
                new IntentFilter(NotificationConfig.REGISTRATION_COMPLETE));

        // register new push message receiver
        // by doing this, the activity will be notified each time a new message arrives
        LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver,
                new IntentFilter(NotificationConfig.PUSH_NOTIFICATION));

        // clear the notification area when the app is opened
        NotificationUtil.clearNotifications(getApplicationContext());
    }

    @Override
    protected void onPause() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver);
        super.onPause();
    }
}

Sending messages directly from Firebase Console works fine. Now the problem is sending messages via PHP script. Somewhow the server manages to send the message successfuly, e.g:

{"message_id":4732936739964848111}

, and the device receive it:

06-19 09:26:21.590 18604-19560/net.anta40.app.firebasetest E/MyFirebaseMessagingService: From: /topics/global 06-19 09:26:21.590 18604-19560/net.anta40.app.firebasetest E/MyFirebaseMessagingService: Data Payload: {message={"data":{"image":"","is_background":false,"payload":{"bar":"xyz","foo":"123"},"title":"test","message":"mehehehe","timestamp":"2017-06-19 2:26:21"}}} 06-19 09:26:21.600 18604-19560/net.anta40.app.firebasetest E/MyFirebaseMessagingService: push json: {"message":{"data":{"timestamp":"2017-06-19 2:26:21","message":"mehehehe","payload":{"bar":"xyz","foo":"123"},"image":"","title":"test","is_background":false}}} 06-19 09:26:21.600 18604-19560/net.anta40.app.firebasetest E/MyFirebaseMessagingService: Json Exception: No value for data 06-19 09:26:21.720 1098-1098/? D/wpa_supplicant: RX ctrl_iface - hexdump(len=11): 53 49 47 4e 41 4c 5f 50 4f 4c 4c 06-19 09:26:21.720 1098-1098/? D/wpa_supplicant: wlan0: Control interface command 'SIGNAL_POLL'

but not displayed via notifications. What goes wrong here?

dongwujie7477
dongwujie7477 您的PHP易受SQL注入攻击,您需要解决此问题。
3 年多之前 回复

1个回答



您正在发送 data </ code> - 仅</ em>有效负载:</ p>

  公共函数发送($ to,$ message){
$ fields = array(
'到'=&gt; $ to,
//'data'=&gt; $ message,
'data'=&gt; array(“message”=&gt; $ message));

返回$ this-&gt; sendPushNotification($ fields);
}
</ code> </ pre>

< sub>你的其他方法也发送相同的。 </ sub> </ p>

如果你打算使用 notification </ code> -only payload,你可以简单地构造它:</ p>
\ n

 公共函数发送($ to,$ message){
$ fields = array(
'到'=&gt; $ to,
'notification'=&gt; array(“title”= &gt; $ title,
“body”=&gt; $ body));

返回$ this-&gt; sendPushNotification($ fields);
}
</ code> </ pre>
\ n

与从Firebase控制台发送消息的区别在于,来自控制台的消息被视为 notification </ code> 消息。</ p>

在Android中,每种消息类型的处理方式都不同(请参阅处理邮件)。</ p>

一些有用的帖子: </ p>

展开原文

原文

You are sending a data-only payload in your PHP:

public function send($to, $message) {
    $fields = array(
        'to' => $to,
        //'data' => $message,
        'data' => array("message" => $message));

    return $this->sendPushNotification($fields);
}

Your other methods are also sending the same.

If you're going to use a notification-only payload, you could simply structure it like so:

public function send($to, $message) {
    $fields = array(
        'to' => $to,
        'notification' => array("title" => $title,
            "body" => $body));

    return $this->sendPushNotification($fields);
}

The difference from sending a message from the Firebase Console is that messages from the console are considered as notification messages.

In Android, each message type is handled differently (see Handling Messages).

Some useful posts:

douling1936
douling1936 我开始了一个新的项目,仅用于测试Firebase。 发送数据消息工作正常。 我真正想要的是通知消息。 它在service.php中实现为sendNotification()嗯,我仍然有相同的InvalidRegistration。 无论如何,上面链接的repo包含Android应用程序和PHP后端的完整代码。
大约 3 年之前 回复
dongliao3450
dongliao3450 我按照你的建议做了改变。 PHP代码给出了这个输出:{“message_id”:4925507014726462759}。 如果这是正确的,奇怪的是在调试Android应用程序时我没有看到任何与Firebase相关的条目。 嗯。 让我查看我的Android代码....
大约 3 年之前 回复
duanletao9487
duanletao9487 它应该是/ topics / with s。 调用sendToTopic时代码中的方式相同。
大约 3 年之前 回复
du060334
du060334 好吧,我得到了这个:{“multicast_id”:8331713500529146798,“success”:0,“failure”:1,“canonical_ids”:0,“results”:[{“error”:“InvalidRegistration”}]}当调用$时 firebase-> sendNews('/ topic / news',$ title,$ content);. 这是我最新的firebase.php
大约 3 年之前 回复
dongliping003116
dongliping003116 我知道了。 发送到主题时,您应始终包含前缀/ topics /。 如果将其添加,InvalidRegistration错误应该消失。
大约 3 年之前 回复
drasebt1835
drasebt1835 是。 只是新闻,而不是/主题/新闻
大约 3 年之前 回复
drpqxogph15436713
drpqxogph15436713 你的意思是新闻? 没有/ topics /?
3 年多之前 回复
duanlie2709
duanlie2709 嗯......我检查了$ fields变量,它在sendPushNotification函数中使用。 漂亮印刷它,并证明'to'的价值是'新闻'。 还有其他你想知道的吗?
3 年多之前 回复
duanna2026
duanna2026 是的,我明白了。 但我想也许参数的值会以某种方式被修改,导致InvalidRegistration错误。
3 年多之前 回复
dtk31564
dtk31564 JSON有效负载仍然相同。 你可以在我的第一篇文章中看到它:$ payload = array(); $ payload ['foo'] ='123'; $ payload ['bar'] ='xyz'; $推> setPaylod($有效载荷);
3 年多之前 回复
dtb81443
dtb81443 奇。 我建议的更改仅适用于消息类型。 你能打印出用于发送消息的JSON有效负载吗?
3 年多之前 回复
dongpao1918
dongpao1918 你好AL。 确实是的。 我已经检查过Firebase注册ID和服务器密钥。 两者都是正确的。
3 年多之前 回复
dongnvwang8591
dongnvwang8591 嗨anta40。 对不起,我有点困惑。 发送到主题(新闻)时是否收到InvalidRegistrationError?
3 年多之前 回复
duannai1883
duannai1883 嗯哪个令牌? 这是设备的Firebase注册ID吗? 不,它在代码中的任何地方都没有被更改/调用。 或者也许是主题? 在MainActivity中,我已经有了FirebaseMessaging.getInstance()。subscribeToTopic(“news”)而在PHP方面,我有$ response = $ firebase-> send('news',$ title,$ content);
3 年多之前 回复
download1323
download1323 InvalidRegistration表示您要定位的令牌无效,请确保无论如何都不会对其进行修改。
3 年多之前 回复
dpzbh1779
dpzbh1779 你好AL,试过你的建议。 我得到了这个:{“multicast_id”:7175672324389225124,“成功”:0,“失败”:1,“canonical_ids”:0,“结果”:[{“错误”:“InvalidRegistration”}]}嗯....
3 年多之前 回复
doucheng3811
doucheng3811 嗨anta40。 当然。 与您可以指定自定义键值对的数据消息不同,通知消息仅包含您可以使用的特定参数。 我将编辑我的答案以显示样本。
3 年多之前 回复
dpmfur2635
dpmfur2635 嗨,AL,原谅我。 我还是很困惑。 似乎问题是我发送的数据有效负载(将由我的应用程序处理)。 我真正想要的是发送通知消息,这些消息将显示在Android系统托盘中。 我应该如何编码消息? 那怎么发送呢? 以前我已经按照处理消息中的步骤进行操作,包括在Android清单中注册MyFirebaseMessagingService。
3 年多之前 回复
dongyan2267
dongyan2267 处理我链接的邮件的相同链接。 如果从控制台发送消息时需要相同的行为,则为是。 :)
3 年多之前 回复
dsw8292301
dsw8292301 嗯,我明白了。 刚做了一些谷歌搜索,发现了这个:firebase.google.com/docs/cloud-messaging/android / ... 所以,似乎我必须使用“通知消息”。 正确?
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问