27

我試圖向所有應用用戶發送通知(在Android上),基本上覆制了通過Firebase管理控制檯發送通知時發生的情況。這裏是CURL命令我開始於:如何通過CURL向所有設備發送Firebase通知?

curl --insecure --header「Authorization:key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM」--header「Content-Type:application/json」-d「{\」notification \「:\」title \「,\」body \「:\」note-Body \「}}」https://fcm.googleapis.com/fcm/send

這是JSON解析出來讓您的眼睛更容易:

{ 
"notification":{ 
    "title":"note-Title", 
    "body":"note-Body" 
    } 
} 

該回來的反應就是兩個字:

就是這樣,單詞「到」。 (Headers報告400)我懷疑這與在我的JSON中沒有「to」有關。甚至會給一個「to」什麼?我沒有定義任何主題,並且設備沒有註冊任何內容。但是,他們仍然能夠從Firebase管理控制檯收到通知。

由於Firebase通知處理的驚人限制,因此如果您的應用處於前臺,通知將由您的處理程序處理,但我想嘗試「僅限數據」JSON包,但如果您的應用處於背景,它將通過Firebase服務進行INTERNALLY處理,並且永遠不會傳遞給您的通知處理程序。顯然,如果你通過API提交你的通知請求,但只有在你使用純數據的情況下才可以解決這個問題。 (然後就會破壞使用相同消息處理iOS和Android的能力。)在我的任何JSON中將「notification」替換爲「data」不起作用。

好了,然後我試圖這裏的解決方案:Firebase Java Server to send push notification to all devices 這似乎是我說「好吧,即使通知大家通過管理控制檯是可能的...這不是真的有可能通過API。」解決方法是讓每個客戶訂閱一個主題,然後將通知推送到該主題。所以先在的onCreate代碼:

FirebaseMessaging.getInstance().subscribeToTopic("allDevices"); 

那麼新的JSON我送:

{ 
"notification":{ 
    "title":"note-Title", 
    "body":"note-Body" 
    }, 
"to":"allDevices" 
} 

所以現在我從服務器獲取至少一個真實的反應。 JSON響應:

{ 
"multicast_id":463numbersnumbers42000, 
"success":0, 
"failure":1, 
"canonical_ids":0, 
"results": 
    [ 
    { 
    "error":"InvalidRegistration" 
    } 
    ] 
} 

並附帶一個HTTP代碼200好的...根據https://firebase.google.com/docs/cloud-messaging/http-server-ref 200代碼以「InvalidRegistration」是指與註冊令牌的問題。也許?因爲這部分文檔是用於消息傳遞服務器的。通知服務器是否一樣?不清楚。我在其他地方看到,該主題可能需要幾個小時才能發揮作用。看起來這樣會讓它無法創建新的聊天室,所以這看起來也是如此。

當我從頭開始編寫一個應用程序時,當我從未使用過Firebase的幾個小時內收到通知時,我非常興奮。在它達到Stripe.com文檔的水平之前,似乎還有很長的路要走。

底線:有誰知道提供什麼JSON來發送消息到所有運行應用程序的設備來鏡像管理控制檯功能?

+0

檢查是否使用正確您的API憑證推送通知您可以按照本教程。也嘗試發送GCM消息到單個設備,看看是否有效。您可以通過在調試中啓動應用程序來獲取InstanceId,並在「FirebaseInstanceIdService」上放置一個斷點。 –

+0

我沒有看到在firebase.google.com/docs的快速谷歌搜索中顯示的「api標記」。你的意思是「ID令牌」?或「身份驗證令牌」?或者你是在談論頭部提供的我的授權密鑰?這一點很好:如果我改變它,服務器響應切換到「未授權」,而不是我正在獲取的錯誤消息。 – Anders8

+0

該博客似乎是關於向特定設備發送消息,而不是像原始討論一樣,只是將其發送給應用的所有用戶。 – Anders8

回答

43

Firebase通知沒有API發送消息。幸運的是,它建立在Firebase雲消息傳遞的基礎之上,Firebase雲消息傳遞正是這樣一個API。

隨着火力地堡聲明和雲信息,您可以通過三種方式發送所謂的下行消息到設備:

  1. to specific devices,如果你知道他們的設備ID
  2. to groups of devices,如果你知道的註冊ID組
  3. to topics,這只是關鍵設備能訂閱

你會注意到日。沒有辦法明確地發送給所有設備。儘管如此,你可以用這些功能來構建這樣的功能。

要發送到某個主題,您的命令中有語法錯誤。主題以/topics/開頭。由於您的代碼中沒有這些內容,因此服務器會將allDevices解釋爲設備ID。由於它是設備註冊令牌的無效格式,因此會引發錯誤。

從文檔上發送消息到主題:

https://fcm.googleapis.com/fcm/send 
Content-Type:application/json 
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA 

{ 
    "to": "/topics/foo-bar", 
    "data": { 
    "message": "This is a Firebase Cloud Messaging Topic Message!", 
    } 
} 
+0

我嘗試提交{「to」:「/ topic/allDevices」,「data」:{「message」:「這是Firebase雲消息傳遞主題消息!「}}並收到相同的InvalidRegistration響應。我會認爲這意味着這個話題是無效的。我沒有辦法在控制檯中查看主題數據庫。 – Anders8

+3

'/ topics /'是複數 –

+0

*傻笑*哦,錯字,程序員的禍根。 ;)新的迴應是:{「message_id」:5115052numbers95180}當然看起來更成功。因此,聽起來底線是,儘管管理控制檯中有一個通過「通知」發送通知的電源功能,但沒有辦法從API提交中觸發此功能,並且應該將自己轉換爲使用郵件。 (丟失通知中內置的計劃和轉換跟蹤)我將查找消息代碼來處理接收。謝謝弗蘭克。 :) – Anders8

-6

您可以用通知發送到所有設備「/主題/ all」來做到這一點

https://fcm.googleapis.com/fcm/send 
Content-Type:application/json 
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA 

{ 
    "to": "/topics/all", 
    "notification":{ "title":"Notification title", "body":"Notification body", "sound":"default", "click_action":"FCM_PLUGIN_ACTIVITY", "icon":"fcm_push_icon" }, 
    "data": { 
    "message": "This is a Firebase Cloud Messaging Topic Message!", 
    } 
} 
+0

這是新功能嗎?或者這是否需要應用程序訂閱「全部」? – Anders8

+0

它是默認功能。我不訂閱任何主題。它爲我工作。但我做了令牌註冊。 「getToken」 – sivakg2000

+0

這不起作用,據我所知 –

3

的一種方法是讓所有您的用戶設備訂閱了一個主題。通過這種方式,當您將消息定位到特定主題時,所有設備都會獲得該消息。我想這是Firebase控制檯中的通知部分如何實現的。

+0

閱讀此blogpost瞭解更多詳情 - > http://developine.com/how-to-send-firebase-push-notifications-from-app-server-tutorial/ –

4

我想出了將推送通知發送給所有設備的最簡單方法是將它們訂閱到「全部」主題,然後發送通知給此主題。 拷貝在主要活動

FirebaseMessaging.getInstance().subscribeToTopic("all"); 

現在發送請求作爲

{ 
    "to":"/topics/all", 
    "data": 
    { 
     "title":"Your title", 
     "message":"Your message" 
     "image-url":"your_image_url" 
    } 
} 

這可能是低效或非標準的方式,但正如我上面提到的這是最簡單的。如果您有更好的方式發送推送通知到全部設備,請發郵件。

如果你是新來發送使用火力地堡雲端通訊Tutorial - Push Notifications using FCM

+0

這對我來說很有意義。但是和你一樣,我不確定它是否低效。請有人澄清一下嗎? – JCarlos

+1

我不認爲它效率低下,這可能是向所有設備發送推送通知的唯一可能方式(至少我找不到任何其他方式) –

相關問題