何时需要一个应用服务器来使用Firebase Cloud Messaging?

6
我是一个新手,在 https://firebase.google.com/docs/cloud-messaging/server 上了解如何使用 FCM(Firebase Cloud Messaging)通知 Android 应用程序。在了解 FCM 服务器页面要求的过程中,我发现以下内容:

你必须在环境中实现一个应用服务器。此应用服务器通过所选的 FCM 连接服务器,使用适当的 XMPP 或 HTTP 协议向客户端应用发送数据。

然而,我对此感到非常困惑。在阅读更多文章时,我看到了以下 API:

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

如果我使用类似于 OkHttpClient 的东西调用此 API,并像这样构建我的请求(假设我已经包含身份验证标头和 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通知方面的误解,那就太好了。如果有人能举例说明何时或何处需要应用服务器,或者如何实际实现它,那也将不胜感激。谢谢!


是的,您可以使用Firebase API从设备发送通知。 - Burhanuddin Rashid
2
Firebaser在此 通过API发送下行消息需要使用您项目的服务器密钥。由于该密钥允许代表您的应用程序发送消息,因此它不应嵌入到您发送给用户的应用程序中。因此需要一个应用程序服务器。 - Frank van Puffelen
2
不行。这同样是很危险的。如果没有使用应用服务器,您不能使用Firebase Cloud Messaging发送设备到设备的消息。将您的服务器密钥暴露给客户是一个坏主意。关于一种方法,请参阅此博客文章:https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html - Frank van Puffelen
@FrankvanPuffelen 哦,我明白了。为什么向客户端公开服务器密钥是个坏主意呢?如果我这样做,我不确定在我的Android项目中应该把Node.js脚本放在哪里。你能指点我一个资源,告诉我如何将Node.js与我的Android应用程序连接起来吗? - user1871869
1
这篇博客文章解释了为什么在客户端应用程序中拥有你的服务器密钥是一个坏主意。它还展示了如何使用Firebase数据库来实现应用程序和node.js服务器之间的通信。 - Frank van Puffelen
显示剩余2条评论
3个回答

1
当文档中提到需要应用服务器时,主要是因为您需要一个应用程序来存储您想要发送通知的设备的令牌,并且此应用程序应在任何客户端设备更改其令牌时更新令牌。但是,如果您拥有那些设备的令牌ID,则可以使用OkHttpClient向FCM服务发送请求,从而向其他设备发送通知。这取决于您想要做什么以及您想如何管理通知。
如果您想了解如何在Java中实现服务器应用程序的示例,这里有一个很好的示例示例1,或者这里有另一个使用PHP实现的帖子。如果您想了解如何实现客户端应用程序以及如何从Firebase控制台测试它的示例,则这里有另一个很好的示例

我明白了,感谢您的帮助。实际上还有一个问题:在 PHP 上实现后,我如何从我的 Java 代码中调用 PHP 脚本?我该如何与 PHP 脚本通信,以便它可以发送包含任何我想要的信息的通知? - user1871869
@user1871869 如果您的服务器实现是PHP,您可以使用标准库来进行POST和GET请求,从而从Java调用PHP脚本。例如,如此示例所述。因此,您可以将数据从Java应用程序发送到PHP脚本,以便PHP脚本使用Firebase向移动设备发送通知。如果您的PHP服务器实现存储移动设备的令牌,则这将非常有用。 - GeorgeLBA
1
正如我在问题上面所评论的,发送下行消息需要指定项目的服务器密钥,这个密钥不应该嵌入到你的应用程序中。 - Frank van Puffelen

1
如果您使用XMPP协议,应该实现一个连接服务器来管理与FCM的连接,以处理上行和下行消息。
这是一个示例Java项目,展示了Firebase Cloud Messaging (FCM) XMPP连接服务器。这个项目是我开发的一个非常简单的独立服务器,作为一个更大项目的基础。它是一个应用程序服务器,我们必须在我们的环境中实现。这个服务器使用XMPP协议通过FCM CCS服务器向客户端应用程序发送数据。

https://github.com/carlosCharz/fcmxmppserver

我还创建了一个YouTube视频,解释了它的作用。

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

希望您觉得它有用。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接