【问题标题】:Send notification from web to android device using Firebase使用 Firebase 将通知从网络发送到 Android 设备
【发布时间】:2017-09-16 20:24:03
【问题描述】:

我现在正在尝试一段时间来实现这个流程:当用户在服务器应用程序上添加一些文件时,通知应该触发并从服务器发送到 FCM,然后从那里传递消息说:'新文件已添加'。 基本上我想通知移动设备用户服务器上的某些内容已更改。

我已经尝试了很多东西,但至少似乎没有像我预期的那样奏效。 在移动端,我在 Xamarin.Android 项目中设置了 Firebase,当我直接从 Firebase 控制台发送通知时,我会收到通知,一切都很好。

但我不想通过 Firebase 控制台发送通知,我宁愿将通知从服务器(这是 ASP.NET MVC 项目)发送到 Firebase 控制台,然后将其从那里传递到 android 设备。

我的第一个问题是:有没有人知道如何通知网络应用关于 device_id 的信息? android设备有什么方法可以在服务器上发送这些信息吗?也许从那里我可以存储这些数据并偶尔更新它,因为它基本上是一个刷新令牌。

我的第二个问题是这样的:即使我硬编码活动 android 设备的当前 device_id 并尝试使用此代码从服务器发送消息:

public class FirebaseService : IFirebaseService
{
    public void SendMessageToClientApplication(string message, string serverApiKey, string senderId, string deviceId)
    {
        AndroidFCMPushNotificationStatus result = new AndroidFCMPushNotificationStatus();

        try
        {
            result.Successful = false;
            result.Error = null;

            deviceId = "eMk6mD8P8Dc:APA91bG5Lmqn4Hwb4RZJ1Mkdl8Rf_uYQsQCEfDJK334tzSvIGzdao7o2X6VmtcTEp_Li0mG8iUoUT7-_RnZxQKocHosZwx6ITWdpmQyCwUv60IIIy0vxNlEaccT6RqK6c-cE1C6I3FTT";

            var value = message;
            WebRequest tRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send");
            tRequest.Method = "post";
            tRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
            tRequest.Headers.Add(string.Format("Authorization: key={0}", serverApiKey));
            tRequest.Headers.Add(string.Format("Sender: id={0}", senderId));

            string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message="
                + value + "&data.time=" + DateTime.Now.ToString() + "&registration_id=" + deviceId + "";

            Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            tRequest.ContentLength = byteArray.Length;

            using (Stream dataStream = tRequest.GetRequestStream())
            {
                dataStream.Write(byteArray, 0, byteArray.Length);

                using (WebResponse tResponse = tRequest.GetResponse())
                {
                    using (Stream dataStreamResponse = tResponse.GetResponseStream())
                    {
                        using (StreamReader tReader = new StreamReader(dataStreamResponse))
                        {
                            String sResponseFromServer = tReader.ReadToEnd();
                            result.Response = sResponseFromServer;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            result.Successful = false;
            result.Response = null;
            result.Error = ex;
        }
    }
} 

我在 Firebase 控制台中一无所获,当然在设备上也一无所获。

我曾尝试在我的服务器应用程序上将 Firebase Web 实现为 javascript,如下所示:

<script>
    var config = {
        apiKey: "mykey",
        authDomain: "myauthdomain",
        databaseURL: "mydatabaseurl",
        projectId: "myprojectid",
        storageBucket: "mystoragebucket",
        messagingSenderId: "mysenderid"
    };

    window.onload = function () {
        firebase.initializeApp(config);

        const messaging = firebase.messaging();

        messaging.requestPermission()
            .then(function () {
                console.log('Notification permission granted.');
                return messaging.getToken()
            })
            .then(function (token) {
                console.log(token);
            })
            .catch(function (err) {
                console.log('Unable to get permission to notify.', err);
            });

        messaging.onMessage(function (payload) {
            console.log('onMessage: ', payload);
        });
    }
</script>

但是这段代码获得了某种不同的 device_id(又名令牌),可能是为该服务器机器生成的。

有没有人有将 device_id 发送到服务器应用程序并从那里发送通知消息到 Firebase 控制台的经验?我会很感激一些代码示例、教程或任何可以提供帮助的东西,因为我在谷歌搜索期间找不到有用的东西。

【问题讨论】:

    标签: asp.net-mvc firebase notifications xamarin.android firebase-cloud-messaging


    【解决方案1】:

    我的第一个问题是:有没有人知道我如何告知网络应用关于 device_id 的信息?

    最常用的方法是将设备令牌列表(使用 FCM 的每个设备都有这样的令牌)存储在数据库中,例如 Firebase 数据库。在Cloud Functions for Firebase documentation 中有一个例子。在本例中,接收消息的设备是网页,但 iOS 和 Android 的方法是相同的。

    我也推荐阅读Sending notifications between Android devices with Firebase Database and Cloud Messaging。在本文中,每个用户subscribes to a topic 不是发送到设备令牌。这样可以避免在您的代码中管理设备令牌。

    【讨论】:

    • 感谢此链接和示例。这对我来说是一个很好的起点。 :) @FrankvanPuffelen
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多