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

174

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

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

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

  • 0
    Где вы размещаете свой сервер для отправки уведомлений?
  • 0
    istudy.io/android-push-notifications-using-firebase-fcm
Показать ещё 6 комментариев
Теги:
firebase
firebase-cloud-messaging

11 ответов

171
Лучший ответ

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}"
  • 0
    Спасибо! Очень полезно!
  • 4
    Как я могу получить идентификатор устройства на iOS? Это токен устройства, который мы получаем на didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData, или длинный, который мы получаем с помощью FIRInstanceID.instanceID (). Token () ?
Показать ещё 17 комментариев
38

Это работает с использованием 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-интерфейс устаревшего сервера)

  • 0
    В консоли Firebase нет данных для сохранения push-сообщений на fcm.googleapis.com/fcm/send ?
  • 0
    Ты спас мой день. Спасибо!
38

Используйте службу 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, не вызываемый приложением в фоновом режиме

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

Примеры с использованием 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

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

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

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!"
  }
}
  • 0
    Где вы нашли конечную точку URL- адреса fcm.googleapis.com/fcm/send , где в документации по Firebase нет ни одного wherw?
  • 1
    Вы можете найти это по этой ссылке firebase.google.com/docs/cloud-messaging/server
Показать ещё 2 комментария
22

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

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

Значение: вам нужно будет хранить идентификаторы регистрации FCM/GCM (нажать маркеры) самостоятельно или использовать темы FCM для подписки на пользователей. Имейте в виду, что FCM не API для уведомлений Firebase, это API более низкого уровня без планирования или аналитики с открытой скоростью. Уведомления Firebase строятся сверху на FCM.

4

Сначала вам нужно получить токен от 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 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 script для Google Cloud Messaging (GCM). Firebase и его консоль находятся на вершине GCM.

Я нашел это на github: https://gist.github.com/prime31/5675017

Подсказка: этот PHP script приводит к сообщению android.

Поэтому: прочитайте этот ответ от Koot, если вы хотите получать и показывать уведомление в Android.

1

Сообщение об уведомлении или данных может быть отправлено на базовый сервер облачных сообщений firebase с использованием конечной точки API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send.

Вам необходимо сгенерировать и загрузить закрытый ключ учетной записи службы с помощью консоли Firebase и сгенерировать ключ доступа с помощью клиентской библиотеки google api. Используйте любую http-библиотеку для отправки сообщения в конечную точку, ниже код показывает сообщение с использованием OkHTTP. Вы можете найти полный код на стороне сервера и клиента на firebase cloud messaging и отправлять сообщения нескольким клиентам с использованием примера темы 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");
}
  • 0
    Мой друг, fcm.googleapis.com/v1/projects/zoftino-stores/messages: отправить эту ссылку, кажется, истек!
  • 1
    Вам нужно использовать URL-адрес вашего проекта Google, а не этот, замените "zotino-stores" на имя вашего проекта
0

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

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

Если вы хотите отправить push-уведомления от android, зарегистрируйтесь в моем сообщении в блоге

Отправлять Push-уведомления от одного телефона android до другого без сервера.

отправка push-уведомления - это не что иное, как сообщение для https://fcm.googleapis.com/fcm/send

фрагмент кода с использованием volley:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню