解决Firebase推送通知问题Android

时间:2016-09-14 05:50:17

标签: android firebase-cloud-messaging

我刚刚将我的应用程序中的推送通知与Firebase集成在一起。我已经阅读了FCM docs中的整个说明。

它只是自动生成了服务器密钥,并提供了我放在应用程序根文件夹中的google-services.json文件。以下是按键的屏幕截图。

然后我在“密钥限制”下的Android应用中添加了我的包名和SHA1-Fingerprints以及选择。我还在控制台中启用了GCM。

让我发疯的事情是,当我从控制台发送通知时,我收到了通知,但是当我尝试从服务器发送通知时,它显示错误401 Unauthorized

所以我需要在后端更改我的代码吗?我在后端使用服务器密钥发送推送通知,我是否也需要将发件人ID发送到后端?谷歌是否改变了它的机制?

我的FCM后端代码:

$fields = array (
            'registration_ids' => array (
                    $id
            ),
            'data' => array (
                    "message" => $message
            )
    );
    $fields = json_encode ( $fields );

    $headers = array (
            'Authorization: key=' . "YOUR_KEY_HERE",
            'Content-Type: application/json'
    );

    $ch = curl_init ();
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_POST, true );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );

    $result = curl_exec ( $ch );
    echo $result;
    curl_close ( $ch );

对于GCM:

static function send_notifications($registatoin_ids, $messages) { 

        $url = 'https://android.googleapis.com/gcm/send';

        $fields = array(
            'registration_ids' => $registatoin_ids,
            'data' => $messages,
        );
        $apiKey='AIzaSyDzto66Dq0neU3AKjujr0eCEn2glWuk0-E';

        $headers = array(
            //'Authorization: key = AIzaSyBpZ3t68mtXRa4oRft9fmbaHaXFb-H_k-8',
             'Authorization: key=' . $apiKey,
            'Content-Type: application/json'
        );

        $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);
        //echo "<pre>";
//print_r($result);die;
        if ($result === FALSE) {
           die('Curl failed: ' . curl_error($ch));
        }

        // Close connection
        curl_close($ch);

        return $result;
    }

感谢。

enter image description here

2 个答案:

答案 0 :(得分:1)

你提到了

  

然后我刚刚在密钥限制下的 Android应用中添加了我的包名和SHA-Fingerprints。我还在控制台中启用了GCM。

使用Google Developers Console中的新界面,似乎不再有选择要生成的API密钥类型的选项,但是,您仍然可以提供一些限制。根据您的说法,由于您选择了Android限制,因此API密钥被视为Android密钥。

关于FCM(甚至GCM)的事情是必须使用的API密钥是服务器密钥。我建议尝试将限制更改为IP服务器地址,添加服务器IP地址,然后测试推送通知。

答案 1 :(得分:0)

它现在开始工作,我刚刚找到了一个链接,因为我认为我应该与大家分享: - https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol