Когда вам нужен сервер приложений для Firebase Cloud Messaging?

Я новичок в использовании уведомлений FCM для приложений Android по адресу https://firebase.google.com/docs/cloud-messaging/server. Я читал об этом и обнаружил, что на странице «О требованиях к серверу FCM» говорится следующее:

Сервер приложений, который вы должны реализовать в своей среде. Этот сервер приложений отправляет данные клиентскому приложению через выбранный сервер соединений FCM, используя соответствующий протокол XMPP или HTTP.

Тем не менее, я очень смущен по этому поводу. Читая статью дальше, я вижу, что есть API, который выглядит так:

POST http://fcm.googleapis.com/fcm/send

Если я вызову этот API, используя что-то вроде OkHttpClient, и создам свой запрос таким образом (при условии, что у меня есть заголовки аутентификации и тело POST)

private void sendRegistrationToServer(String token) {
    OkHttpClient client = new OkHttpClient();
    RequestBody body = new FormBody.Builder().add(“Body", "").build();
    //Assuming I have authentication and body put in
    Request request = new Request.Builder().url("http://fcm.googleapis.com/fcm/send”).post(body).build();
    try {
        client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

Смогу ли я теоретически отправить уведомление с любой информацией, которую я хочу, на это устройство? Я могу получить сообщение через следующий класс:

public class NotificationService extends FirebaseMessagingService {
    ...
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        // TODO(developer): Handle FCM messages here.
        Log.d(TAG, "From: " + remoteMessage.getFrom());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }
    }

Я уверен, что мое понимание где-то неверно, поскольку в документации говорится, что нам нужен сервер приложений, но если бы кто-нибудь мог указать, где я неправильно понимаю, как реализовать уведомления FCM, это было бы здорово. Если бы кто-то мог привести пример того, где и когда нам понадобится сервер приложений, или как его ДЕЙСТВИТЕЛЬНО следует реализовать, это также было бы очень признательно. Спасибо!


person user1871869    schedule 26.08.2016    source источник
comment
Да, вы можете отправлять уведомления с устройства с помощью Firebase API   -  person Burhanuddin Rashid    schedule 26.08.2016
comment
Какую именно ошибку вы получаете?   -  person Burhanuddin Rashid    schedule 26.08.2016
comment
firebaser здесь Для отправки нисходящих сообщений через API требуется использование ключа сервера вашего проекта. Поскольку этот ключ позволяет отправлять сообщения от имени вашего приложения, его никогда не следует встраивать в приложение, которое вы отправляете своим пользователям. Отсюда потребность в сервере приложений.   -  person Frank van Puffelen    schedule 02.10.2016
comment
@FrankvanPuffelen Я понимаю, что ты говоришь. Итак, в моем приложении у меня есть настройка базы данных Firebase. Вы говорите, что я должен жестко закодировать ключ API в моей базе данных Firebase, а затем просто извлечь из базы данных, чтобы получить ключ? Почему бы мне не встроить его в свое приложение как const final String?   -  person user1871869    schedule 02.10.2016
comment
Нет. Это было бы одинаково опасно. Вы не можете отправлять сообщения с устройства на устройство с помощью Firebase Cloud Messaging без использования сервера приложений. Раскрытие вашего ключа сервера вашим клиентам — плохая идея. Об одном подходе см. в этом сообщении в блоге: firebase.googleblog.com. /2016/08/   -  person Frank van Puffelen    schedule 02.10.2016
comment
@FrankvanPuffelen А. Я понимаю. Почему предоставление ключа сервера вашему клиенту — плохая идея? Я не уверен, куда поместить мой скрипт Node.js в моем проекте Android, если я сделаю это таким образом. Не могли бы вы указать мне ресурс, который мог бы показать мне, как подключить Node.js к моему приложению для Android?   -  person user1871869    schedule 02.10.2016
comment
В сообщении блога объясняется, почему не рекомендуется иметь ключ сервера в клиентском приложении. Также показано, как использовать базу данных Firebase для связи между вашим приложением и сервером node.js.   -  person Frank van Puffelen    schedule 02.10.2016


Ответы (3)


Когда в документации говорится, что вам нужен сервер приложений, это в основном потому, что вам нужно приложение, в котором хранятся токены устройств, на которые вы хотите отправлять уведомления, и это приложение должно обновлять токены, если какое-либо из ваших клиентских устройств меняет свой токен. Однако вы можете использовать OkHttpClient для отправки запроса в службу FCM и, следовательно, отправки уведомления на другие устройства, если у вас, конечно, есть идентификатор токена этих устройств. Это зависит от того, что вы хотите сделать, и от того, как вы хотите управлять уведомлениями.

Если вам нужен пример того, как реализовать серверное приложение в java, вот хороший пример пример 1, который был опубликован, или вот еще один post с реализацией на PHP. Если вам нужен пример того, как реализовать клиентское приложение и как его протестировать из консоли firebase, вот еще один хороший пример.

person GeorgeLBA    schedule 26.08.2016
comment
Я понимаю. Спасибо за вашу помощь. На самом деле один вопрос: с реализацией на PHP, как я могу вызвать PHP-скрипт из моего Java-кода? Как я могу общаться с PHP-скриптом, чтобы он отправлял уведомление с любой информацией, которую я хотел бы? - person user1871869; 27.08.2016
comment
Как я прокомментировал выше, отправка нисходящих сообщений требует, чтобы вы указали ключ сервера проекта, который никогда не должен быть встроен в ваше приложение. - person Frank van Puffelen; 02.10.2016

Если вы используете протокол XMPP. Вы должны реализовать сервер соединений, который управляет соединением с FCM для обработки восходящих и нисходящих сообщений.

Это пример Java-проекта для демонстрации сервера соединений Firebase Cloud Messaging (FCM) XMPP. Этот проект представляет собой очень простой автономный сервер, который я разработал как основу более крупного проекта. Это сервер приложений, который мы должны реализовать в нашей среде. Этот сервер отправляет данные клиентскому приложению через сервер FCM CCS, используя протокол XMPP.

https://github.com/carlosCharz/fcmxmppserver

А также я создал видео на YouTube, где я объясняю, что он делает.

https://www.youtube.com/watch?v=PA91bVq5sHw

Надеюсь, что вы найдете ее полезной.

person Carlos Becerra Rodriguez    schedule 22.09.2016

Никаких дополнительных действий выполнять не нужно, просто перейдите по ссылке ниже:

https://github.com/firebase/quickstart-android/tree/master/messaging

person ViramP    schedule 26.08.2016