2016-10-11 45 views
5

我有一個iOS應用程序,該應用程序存在於應用程序商店中。我可以將推送通知發送到安裝了應用程序的iOS設備,但只能在從Firebase控制檯發送推送通知時發送。當通過cURL/PHP發送的設備上未收到Firebase通知

當我嘗試通過cURL請求發送推送通知時,來自服務器的響應表明我已成功,但未在設備上收到消息。我已經在多播和單個收件人有效載荷上嘗試了這一點。

我必須錯過更基本的東西,但我看不到它。

這是我的PHP代碼:

<?php 
// API access key from Google API's Console 
define('API_ACCESS_KEY', 'AI*****4LPGkx8xtDG2tBl*****7KWJfmp1szcA'); 
$registrationIds = array($_GET['id']); 
// prep the bundle 
$msg = array 
(
    'message' => 'here is a message. message', 
    'title'  => 'This is a title. title' 
); 
$fields = array 
(
    'to'   => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE", 
    'data'   => $msg 
); 

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

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send'); 
curl_setopt($ch,CURLOPT_POST, true); 
curl_setopt($ch,CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch,CURLOPT_POSTFIELDS, json_encode($fields)); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 

下面是運行這段代碼時,我得到了響應:

{ 「multicast_id」:5814921248239922706, 「成功」:1, 「失敗」 :0, 「canonical_ids」:0 「結果」:[{ 「MESSAGE_ID」: 「0:1476193002715692%a4ddee3cf9fd7ecd」}]}

+0

成功添加鍵和值類似例子和處理:1,貌似消息是越來越成功傳遞。你有沒有更新iOS 10的代碼? – FredLoh

+0

是的。該應用程序已成功轉換爲Swift 2.3。從Firebase控制檯發送通知時成功傳遞通知 –

+0

您是否能夠在測試設備上運行應用程序並查看消息是否正在傳遞? – FredLoh

回答

6

有兩個問題:

  1. 我需要包括在有效載荷,而不是data
  2. 不知何故,有效載荷沒有被正確的PHP格式化的notification部分。

最後我用PHP函數shell_exec()來通過SSH做一個cURL請求。這並不理想,但它完成了工作。

示例代碼:

shell_exec('curl -X POST --header "Authorization: key=<key here>" --header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"'.$to.'\",\"priority\":\"high\",\"notification\":{\"body\": \"'.stripslashes($message).'\"}}"'); 
+1

哇感謝夥計,我和我的團隊成員搞亂了很多事情謝謝人幫助我! (Y) –

+0

並感謝您不刪除你的問題:P –

+0

我試着用CURL和SHELL編碼,但仍然沒有收到設備的消息。 檢查迴應:{「multicast_id」:86505386437 ********,「success」:1,「failure」:0,「canonical_ids」:0,「results」:[{「message_id」:「0 :1496139295510837%32c366ea ********「}]} –

1

嘗試添加{優先權:高}

$fields = array 
(
    'to'   => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE", 
    'data'   => $msg, 
    'priority'  =>'high' 
); 
4

從火力地堡documentation你必須在消息中使用任一數據通知的選擇有效載荷。但是,當您使用數據時,您有責任自行處理收到的通知。換句話說,它不會直接發送到您的應用程序客戶端。您在didReceiveRemoteNotification處理:IOSonMessageReceived()的情況下的Android

如果您在有效負載中使用通知,則firebase會立即將消息發送到您的客戶端應用程序。

這就是爲什麼即使你的curl請求告訴你它已經成功發出請求,你也不會收到消息(如果你使用了數據)。

+0

我使用了@Robbie Lewis答案,並用通知替換了數據...並完成 –

0

這是我用什麼:

<?php 
define('API_ACCESS_KEY', 'AIzaXXXXXXXXXXXXXXXXXXXXXxaDt14XXXX'); 
$msg = array 
(
    'body' => 'msg', 
    'title'  => 'title', 
    'key1' => 'val1' 
); 
$fields = array 
(
    'to'   => "ckXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXOTKAo51XkJn27idSbTfXXXXXXXXXXXDAJ0SCZkSViHYXXXXXXXXXXXKHCyPgFBEiXXXXXXXXXXXMu0A6I3iEoI3AXXXXXXXXXXXXXXXXXX", 
    'notification'   => $msg 

); 

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

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send'); 
curl_setopt($ch,CURLOPT_POST, true); 
curl_setopt($ch,CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch,CURLOPT_POSTFIELDS, json_encode($fields)); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 
?> 

你可以在你的程序