Как я могу отправить уведомление Firebase Cloud Messaging без использования Firebase Console?

200

Я начинаю с нового сервиса Google для уведомлений Firebase Cloud Messaging.

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

Есть ли какой-либо API или способ отправить уведомление без использования консоли Firebase? Я имею в виду, например, PHP API или что-то в этом роде, чтобы создавать уведомления непосредственно с моего собственного сервера.

Дэвид Коррал
источник
1
Где вы размещаете свой сервер для отправки уведомлений?
Родриго Руис
@ Дэвид Коррал, проверьте мой ответ на то же самое. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
Выписали пружинный приложение для отправки уведомлений ТСМ упаковывают вы хотите увидеть , как это работает -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
Aniket Тхакур
Вы можете использовать модификацию для сообщения устройства на устройство. 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.instanceID (). Token () ?
FelipeOliveira
3
Фрэнк: Я следовал руководству в документах Firebase и кодовых ярлыках, чтобы добавить push-уведомления в прогрессивное веб-приложение и использовать POstman для отправки http-запроса, но я все еще получаю ошибку 401. Какие-либо предложения. Я копирую свой ключ сервера прямо с моей консоли Firebase.
Джасан
25
как отправить всем пользователям, а не конкретным пользователям или темам?
vinbhai4u
3
Я получил это сообщение об ошибке в одной из моих ранних попыток с фрагментом CURL: поле «приоритет» должно быть числом JSON: 10. После того, как я удалил кавычки из 10 в конце, это сработало.
Альберт С Браун
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 сервера (или ключ API устаревшего сервера)

Хамза Малик
источник
В консоли Firebase нет данных для сохранения 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

Тело / Payload:

{ "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 не вызывается, когда приложение в фоновом режиме

Анкит Адлаха
источник
Анкит, я могу отправить на конкретное устройство идентификатор. Тем не менее, я не могу отправить всем. Что я должен поставить "to" : "to_id(firebase refreshedToken)"вместо идентификатора устройства? "all"не работает вообще. Я использую C # WebRequestдля отправки уведомления. @AshikurRahman Ваше предложение также приветствуется. Я борюсь и ищу с 3-4 дней.
Равималля
3
Неважно. Я нашел решение. to: "/ themes / all" отправит уведомления на все устройства или, если вы хотите настроить таргетинг только на IOS, замените все на ios и для android, замените на `android '. Это набор тем по умолчанию. Я думаю.
Равималля
developine.com/...
Developine
Прочтите этот пост для более подробной информации -> developine.com/…
Developine
@Ankit, привет, не могли бы вы указать, как получить идентификатор целевого устройства?
Ананд Радж
40

Примеры использования curl

Отправлять сообщения на определенные устройства

Чтобы отправлять сообщения на определенные устройства, установите токен регистрации для конкретного экземпляра приложения.

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

Отправлять сообщения в темы

здесь тема есть: / themes / 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

Отправлять сообщения группам устройств

Отправка сообщений в группу устройств очень похожа на отправку сообщений на отдельное устройство. Установите для параметра to уникальный ключ уведомления для группы устройств.

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

Примеры использования Service 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!"
  }
}
JR
источник
Где вы нашли конечную точку URL fcm.googleapis.com/fcm/send , где в документации по Firebase нет ни одного wherw?
Утсав Гупта
1
Вы можете найти это по этой ссылке firebase.google.com/docs/cloud-messaging/server
JR
@JR Я создал приложение для чата, в котором, когда пользователь отправляет сообщение получателю, получатель должен получить уведомление. В таком случае, как я могу использовать ваш ответ? Так что я должен дать значение для поля «to»?
Ананд Радж
@ Анад Радж ссылается на «Отправлять сообщения на определенные устройства» в моем ответе
JR
25

Как уже упоминал Фрэнк, вы можете использовать HTTP API Firebase Cloud Messaging (FCM) для запуска push-уведомлений из собственного бэкэнда. Но вы не сможете

  1. отправлять уведомления на идентификатор пользователя Firebase (UID) и
  2. отправлять уведомления в пользовательские сегменты (нацеливая свойства и события, как вы можете на пользовательской консоли).

Значение: вам придется хранить идентификаторы регистрации (push-токены) FCM / GCM самостоятельно или использовать темы 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 клиента, см. Пример отправки специфических сообщений клиента или устройства на сервер FCM.

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: отправить эту ссылку, вероятно, истек!
Насер Никзад,
1
Вам нужно использовать URL-адрес вашего проекта Google, а не этот, замените "zotino-stores" на имя вашего проекта
Арнав Рао
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.

Руберандинда Терпение
источник
1
Go to cloud Messaging select:  Server key



function sendGCM($message, $deviceToken) {

    $url = 'https://fcm.googleapis.com/fcm/send';
    $fields = array (
            'registration_ids' => array (
                $id
            ),
            'data' => array (
                "title" =>  "Notification title",
                "body" =>  $message,
            )
    );
    $fields = json_encode ( $fields );
    $headers = array (
        'Authorization: key=' . "YOUR_SERVER_KEY",
        '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);
}
Хулио Филс
источник
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);

Я предлагаю всем вам проверить мой блог для более подробной информации.

Манохар Редди
источник
developine.com/…
Developine
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
PRATEEK BHARDWAJ
источник
0

Или вы можете использовать облачные функции Firebase, что для меня является более простым способом реализации ваших push-уведомлений. firebase / функции-образцы

Лоран Макэ
источник
0

Если вы используете PHP, я рекомендую использовать PHP SDK для Firebase: Firebase Admin SDK . Для простой настройки вы можете выполнить следующие действия:

Получить JSON-файл с учетными данными проекта из Firebase ( инициализировать SDK ) и включите его в свой проект.

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

composer require kreait/firebase-php ^4.35

Попробуйте любой пример из сеанса Cloud Messaging в документации 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);
JC Gras
источник