2016-09-14 76 views
1

我剛剛在我的應用程序中使用Firebase集成了推送通知。我已閱讀FCM docs中的全部說明。獲取Firebase推送通知的問題Android

它只是自動生成服務器密鑰,並提供給我我放在應用程序的根文件夾內的google-services.json文件。以下是按鍵的屏幕截圖。

然後,我只在我的軟件包名稱和SHA1-Fingerprints中選擇了Android應用程序下的關鍵限制。我也在控制檯中啓用了GCM。

令我瘋狂的事情是,當我從控制檯發送通知時,我收到它,但是當我試圖從我的服務器發送它時,它顯示我錯誤401 Unauthorized

那麼我需要在後端更改我的代碼嗎?我在後端使用服務器密鑰發送推送通知,是否需要將發件人ID發送到後端? Google是否改變了它的機制?對於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

+0

請分享您的後端代碼,因爲問題來自於您的問題 –

+0

在android上與服務器共享生成的令牌?這是需要發送通知只有註冊手機 – Raghunandan

+0

@ Raghunandan,是的,我已經發送我的服務器密鑰到後端,請看我的更新後,我也添加了服務器端代碼 – sid

回答

0

它,從現在起,我只是找到了一個鏈接,我想我應該與大家分享: - https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol

+0

嗨sid。你可以分享你做了哪些改變(參考文檔),使它工作? :) –

+1

嘿鋁,問題是我檢查限制鍵爲Android應用程序,當我取消選中它,我得到了項目設置下的服務器密鑰使用,我的通知代碼開始工作正常。 – sid

+0

我明白了。因此,只需使用Firebase控制檯中定義的預定義服務器密鑰即可。謝謝。 :) –

1

你提到

然後,我只是說我的包名稱和SHA-Fingerprints以及Android應用程序在關鍵限制下的選擇。我還在控制檯中啓用了GCM。

使用Google Developers Console中的新界面,似乎不再有選擇要生成的API鍵類型的選項,但是您仍然可以提供一些限制。根據您的說法,由於您爲Android選擇了限制,因此將API密鑰視爲Android密鑰。

關於FCM(甚至GCM)的一點是必須使用的API密鑰是服務器密鑰。我建議嘗試更改IP服務器地址的限制,添加服務器IP地址,然後測試推送通知。