Як я можу надсилати сповіщення про хмарні повідомлення Firebase без використання консолі Firebase?


200

Я починаю з новим сервісом Google для повідомлень Firebase Cloud Messaging.

Завдяки цьому коду https://github.com/firebase/quickstart-android/tree/master/messaging я зміг надсилати сповіщення з консолі користувача Firebase на свій пристрій Android.

Чи є API чи спосіб відправити сповіщення без використання консолі Firebase? Я маю на увазі, наприклад, PHP API або щось подібне, щоб створювати сповіщення безпосередньо з власного сервера.


1
Де ви розміщуєте ваш сервер для надсилання сповіщень?
Родріго Руїз


@David Corral, Перевір мою відповідь. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare

Написав весняний додаток для надсилання сповіщень FCM, якщо ви хочете побачити, як це працює -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/…
Thakur

Ви можете використовувати модернізацію для передачі пристрою на пристрій. stackoverflow.com/questions/37435750 / ...
eurosecom

Відповіді:


218

Firebase Cloud Messaging має серверні API, на які можна телефонувати, щоб надсилати повідомлення. Див. Https://firebase.google.com/docs/cloud-messaging/server .

Надсилання повідомлення може бути таким же простим, як і curlдля виклику кінцевої точки HTTP. Дивіться https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol

curl -X POST --header "Authorization: key=<API_ACCESS_KEY>" \
    --Header "Content-Type: application/json" \
    https://fcm.googleapis.com/fcm/send \
    -d "{\"to\":\"<YOUR_DEVICE_ID_TOKEN>\",\"notification\":{\"body\":\"Yellow\"},\"priority\":10}"

4
Як я можу отримати ідентифікатор пристрою на iOS? Це маркер пристрою, який ми отримуємо на didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData або довгий, який ми отримуємо з FIRInstanceID.instanID (). Token () ?
FelipeOliveira

3
Френк Я дотримувався керівництва в документах та кодексах Firebase для додавання push-сповіщень про прогресивний веб-сервер та використання POstman для розміщення http-запиту, але я все одно отримую помилку 401. Будь-які пропозиції. Я копіюю свій серверний ключ безпосередньо з консолі firebase.
Jasan

25
як надіслати всім користувачам, а не певним користувачам чи темам?
vinbhai4u

3
Я отримав це повідомлення про помилку в одній з моїх ранніх спроб із фрагментом CURL: Поле "пріоритет" повинно бути номером JSON: 10. Після того, як я видалив лапки з 10 в кінці, воно спрацювало.
albert c braun

2
@ vinbhai4u Ви отримуєте відповідь? Я також застряг у цьому. Як надіслати це всім користувачам додатків?
Рохіт

51

Це працює за допомогою CURL

function sendGCM($message, $id) {


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

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

?>

$message це ваше повідомлення для надсилання на пристрій

$id- маркер реєстрації пристроїв

YOUR_KEY_HERE це ваш ключ API сервера (або Legacy Server API Key)


У Firebase Console немає збережених даних push-повідомлень на fcm.googleapis.com/fcm/send ?
Махмудул Хаке Хан

1
щоб відправити push-повідомлення в браузер, звідки я можу отримати ідентифікатор реєстрації пристрою?
Аміт Джоші

це прекрасно працює, але через довгий текст, який я отримую {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Що можна зробити, щоб це виправити?
Аліша Ламіхане

@AlishaLamichhane Ваше повідомлення більше 4096 байт? Якщо ні, ви можете base64 кодувати ваше повідомлення (можливо, з текстом щось не так). Якщо вона більше 4096 байт ... ну, це межа FCM.
Рік

47

Скористайтеся службовим api.

URL: https://fcm.googleapis.com/fcm/send

Тип способу: POST

Заголовки:

Content-Type: application/json
Authorization: key=your api key

Тіло / корисне навантаження:

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

І за допомогою цього у своєму додатку ви можете додати нижче код у своїй діяльності, щоб називатися:

<intent-filter>
    <action android:name="OPEN_ACTIVITY_1" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Також перевірте відповідь на Firebase onMessageReceived not call, коли додаток у фоновому режимі


Ankit, я можу надіслати певний ідентифікатор пристрою. Однак я не можу надіслати всім. Що потрібно поставити "to" : "to_id(firebase refreshedToken)"замість ідентифікатора пристрою? "all"взагалі не працює. Я використовую C # WebRequestдля надсилання сповіщень. @AshikurRahman ваша пропозиція також вітається. Я боюся і шукаю з 3-4 дня.
Ravimallya

3
Не звертай уваги. Я знайшов рішення. до: "/ themes / all" надсилатиме сповіщення на всі пристрої, або якщо ви хочете націлити лише IOS, замініть всі на ios, а на android, замініть на `android '. Це встановлені теми за замовчуванням. Я вважаю.
Ravimallya


Прочитайте цю BlogPost для більш докладної інформації -> developine.com / ...
Developine

@Ankit, Привіт, ви можете, будь ласка, вказати, як отримати ідентифікатор цільового пристрою?
Ананд Радж

40

Приклади, що використовують завиток

Надсилайте повідомлення на певні пристрої

Щоб надсилати повідомлення на певні пристрої, встановіть маркер реєстрації для конкретного екземпляра програми

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "data": { "score": "5x1","time": "15:10"},"to" : "<registration token>"}' https://fcm.googleapis.com/fcm/send

Надсилайте повідомлення тем

тут тема: / теми / foo-bar

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "to": "/topics/foo-bar","data": { "message": "This is a Firebase Cloud Messaging Topic Message!"}}' https://fcm.googleapis.com/fcm/send

Надсилання повідомлень групам пристроїв

Надсилання повідомлень до групи пристроїв дуже схоже на надсилання повідомлень на окремий пристрій. Встановіть параметр на унікальний ключ сповіщення для групи пристроїв

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{"to": "<aUniqueKey>","data": {"hello": "This is a Firebase Cloud Messaging Device Group Message!"}}' https://fcm.googleapis.com/fcm/send

Приклади використання сервісного API

URL-адреса API: https://fcm.googleapis.com/fcm/send

Заголовки

Content-type: application/json
Authorization:key=<Your Api key>

Спосіб запиту: POST

Орган запиту

Повідомлення для певних пристроїв

{
  "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to": "<registration token>"
}

Повідомлення до тем

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

Повідомлення до груп пристроїв

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}

Де ви знайшли URL-адресу кінцевої точки fcm.googleapis.com/fcm/send , її жоден ворс не згадується в документі firebase?
Уцав Гупта

1
Ви можете виявити , що в цьому посиланню firebase.google.com/docs/cloud-messaging/server
JR

@JR Я створив програму для чату, в якій, коли користувач надсилає повідомлення одержувачу, одержувач повинен отримувати повідомлення-сповіщення. Як у цьому випадку я можу використати вашу відповідь? Отже, що я повинен мати, щоб дати значення для поля "до"?
Ананд Радж

@ Anad Raj у моїй відповіді посилається на "Надсилання повідомлень на певні пристрої"
JR

25

Як згадував Франк, ви можете використовувати HTTP API Firebase Cloud Messaging (FCM), щоб викликати push-повідомлення від власного бек-енду. Але ви цього не зможете

  1. надсилати сповіщення на ідентифікатор користувача Firebase (UID) та
  2. надсилати сповіщення в сегменти користувачів (націлювання на властивості та події, як можна на консолі користувача).

Значення: вам доведеться самостійно зберігати ідентифікаційні номера реєстрації FCM / GCM (push-маркери) або використовувати теми FCM для підписки користувачів. Майте також на увазі, що FCM не є API для повідомлень Firebase , це API нижчого рівня без планування чи аналітики відкритої швидкості. Повідомлення Firebase базуються на FCM.


6

Спочатку вам потрібно отримати маркер від android, а потім ви можете зателефонувати на цей php-код і навіть можете надіслати дані для подальших дій у вашому додатку.

 <?php

// Call .php?Action=M&t=title&m=message&r=token
$action=$_GET["Action"];


switch ($action) {
    Case "M":
         $r=$_GET["r"];
        $t=$_GET["t"];
        $m=$_GET["m"];

        $j=json_decode(notify($r, $t, $m));

        $succ=0;
        $fail=0;

        $succ=$j->{'success'};
        $fail=$j->{'failure'};

        print "Success: " . $succ . "<br>";
        print "Fail   : " . $fail . "<br>";

        break;


default:
        print json_encode ("Error: Function not defined ->" . $action);
}

function notify ($r, $t, $m)
    {
    // API access key from Google API's Console
        if (!defined('API_ACCESS_KEY')) define( 'API_ACCESS_KEY', 'Insert here' );
        $tokenarray = array($r);
        // prep the bundle
        $msg = array
        (
            'title'     => $t,
            'message'     => $m,
           'MyKey1'       => 'MyData1',
            'MyKey2'       => 'MyData2', 

        );
        $fields = array
        (
            'registration_ids'     => $tokenarray,
            'data'            => $msg
        );

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

        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, '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 );
        return $result;
    }


?>

3

Ви можете використовувати, наприклад, PHP-скрипт для Google Cloud Messaging (GCM). Firebase та її консоль якраз на вершині GCM.

Я знайшов цей на github: https://gist.github.com/prime31/5675017

Підказка: Цей скрипт PHP призводить до сповіщення Android .

Тому: Прочитайте цю відповідь від Koot, якщо ви хочете отримувати та показувати сповіщення в Android.


2

Повідомлення або повідомлення даних можуть бути надіслані на сервер базових хмарних повідомлень Firebase, використовуючи кінцеву точку API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Вам потрібно створити та завантажити приватний ключ облікового запису служби за допомогою консолі Firebase та створити ключ доступу за допомогою клієнтської бібліотеки google api. Використовуйте будь-яку бібліотеку http, щоб розмістити повідомлення вище кінцевої точки, нижче коду відображається повідомлення про розміщення повідомлення за допомогою OkHTTP. Ви можете знайти повний код на стороні сервера та клієнт у хмарній обробці повідомлень Firebase та надсиланні повідомлень декільком клієнтам на прикладі теми fcm

Якщо через потребу конкретного клієнта повідомлень для відправки, вам необхідно отримати firebase реєстраційного ключа клієнта, див відправки клієнта або пристрою повідомлення , які стосуються наприклад сервера ТСМА

String SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
String FCM_ENDPOINT
     = "https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send";

GoogleCredential googleCredential = GoogleCredential
    .fromStream(new FileInputStream("firebase-private-key.json"))
    .createScoped(Arrays.asList(SCOPE));
googleCredential.refreshToken();
String token = googleCredential.getAccessToken();



final MediaType mediaType = MediaType.parse("application/json");

OkHttpClient httpClient = new OkHttpClient();

Request request = new Request.Builder()
    .url(FCM_ENDPOINT)
    .addHeader("Content-Type", "application/json; UTF-8")
    .addHeader("Authorization", "Bearer " + token)
    .post(RequestBody.create(mediaType, jsonMessage))
    .build();


Response response = httpClient.newCall(request).execute();
if (response.isSuccessful()) {
    log.info("Message sent to FCM server");
}

Мій друг, fcm.googleapis.com/v1/projects/zoftino-stores/messages:send це посилання, здається , минуло !
Насер Нікзад

1
Вам потрібно скористатися URL-адресою google, а не тією, замінити "zotino-магазини" на назву вашого проекту
Arnav Rao,

2

це рішення з цього посилання мені дуже допомогло. ви можете це перевірити.

Файл curl.php з цією інструкцією може працювати.

<?php 
// Server key from Firebase Console define( 'API_ACCESS_KEY', 'AAAA----FE6F' );
$data = array("to" => "cNf2---6Vs9", "notification" => array( "title" => "Shareurcodes.com", "body" => "A Code Sharing Blog!","icon" => "icon.png", "click_action" => "http://shareurcodes.com"));
$data_string = json_encode($data);
echo "The Json Data : ".$data_string;
$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_POSTFIELDS, $data_string);
$result = curl_exec($ch);
curl_close ($ch);
echo "<p>&nbsp;</p>";
echo "The Result : ".$result;

Пам'ятайте you need to execute curl.php file using another browser ie not from the browser that is used to get the user token. You can see notification only if you are browsing another website.


0

Якщо ви хочете надсилати push-повідомлення від Android, перегляньте мою публікацію в блозі

Надішліть Push-сповіщення з одного телефону Android на інший із зовнішнього сервера.

надсилання push-повідомлення - це не що інше, як поштовий запит на https://fcm.googleapis.com/fcm/send

фрагмент коду за допомогою залпу:

    JSONObject json = new JSONObject();
 try {
 JSONObject userData=new JSONObject();
 userData.put("title","your title");
 userData.put("body","your body");

json.put("data",userData);
json.put("to", receiverFirebaseToken);
 }
 catch (JSONException e) {
 e.printStackTrace();
 }

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://fcm.googleapis.com/fcm/send", json, new Response.Listener<JSONObject>() {
 @Override
 public void onResponse(JSONObject response) {

Log.i("onResponse", "" + response.toString());
 }
 }, new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {

}
 }) {
 @Override
 public Map<String, String> getHeaders() throws AuthFailureError {

Map<String, String> params = new HashMap<String, String>();
 params.put("Authorizationey=" + SERVER_API_KEY);
 params.put("Content-Typepplication/json");
 return params;
 }
 };
 MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);

Я пропоную вам усім перевірити мій пост у блозі, щоб отримати повну інформацію.



0

За допомогою Firebase Console ви можете надсилати повідомлення всім користувачам на основі пакету додатків. Але за допомогою CURL або PHP API це неможливо.

Через API Ви можете надсилати сповіщення певному ідентифікатору пристрою або передплаченим користувачам вибраній темі або передплаченим користувачам теми.

Get a view on following link. It will help you.
https://firebase.google.com/docs/cloud-messaging/send-message


0

Якщо ви використовуєте PHP, я рекомендую використовувати PHP SDK для Firebase: Firebase Admin SDK . Для легкої конфігурації ви можете виконати наступні дії:

Отримайте файл json з обліковими записами проекту від Firebase ( ініціалізуйте sdk ) та включіть його у свій проект.

Встановіть SDK у свій проект. Я використовую композитор:

composer require kreait/firebase-php ^4.35

Спробуйте будь-який приклад із сеансу хмарних повідомлень у документації SDK:

use Kreait\Firebase;
use Kreait\Firebase\Messaging\CloudMessage;

$messaging = (new Firebase\Factory())
->withServiceAccount('/path/to/firebase_credentials.json')
->createMessaging();

$message = CloudMessage::withTarget(/* see sections below */)
    ->withNotification(Notification::create('Title', 'Body'))
    ->withData(['key' => 'value']);

$messaging->send($message);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.