我现在正试图实现这个流程:当用户在服务器应用程序上添加一些文件时,通知应该触发并从服务器发送到FCM,然后从那里传递消息,例如:'新文件已被添加”。 基本上我想通知移动设备用户服务器上的某些内容已被更改。
我尝试了很多东西,但似乎没有任何东西像我期望的那样工作,至少。 在移动端,我在我的Xamarin.Android项目中设置了Firebase,当我直接从Firebase控制台发送通知时,我收到通知,一切都很好。
但我不想通过Firebase控制台发送通知,我宁愿从服务器(这是ASP.NET MVC项目)发送通知到Firebase控制台,然后将其从那里传递到Android设备。
我的第一个问题是:有没有人知道如何通知web应用有关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() + "®istration_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网站实现为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(aka token),可能是为该服务器机器生成的。
是否有人有将device_id发送到服务器应用程序的经验,并从那里向Firebase控制台发送通知消息?我会很感激一些代码示例,教程或任何有用的东西,因为我在谷歌搜索期间无法找到有用的东西。
答案 0 :(得分: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发送设备令牌。这可以防止必须在代码中管理设备令牌。