0

我想了一會兒來實現此流程:當用戶在服務器應用程序中添加一些文件時,通知應觸發並從服務器發送到FCM,並從那裏傳遞消息像這樣:'新文件已添加'。 基本上我想通知移動設備用戶,服務器上的東西已經改變。使用Firebase從網絡向Android設備發送通知

我已經嘗試了很多東西,但似乎沒有像我期望的那樣工作,至少。 在移動端,我在Xamarin.Android項目中設置了Firebase,當我直接從Firebase控制檯發送通知時,我收到了通知,而且一切都很好。

但我不想通過Firebase控制檯發送通知,我寧願將通知從服務器(即ASP.NET MVC項目)發送到Firebase控制檯,然後從那裏將它傳遞給Android設備。

我的第一個問題是:有沒有人知道我該如何通知web app有關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; 
     } 
    } 
} 

我什麼也得不到無論在火力地堡控制檯和設備上也沒有任何東西。

我曾試圖實施火力地堡網絡,如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控制檯發送通知消息?我將不勝感激一些代碼示例,教程或任何可以提供幫助的東西,因爲我在Google搜索過程中找不到有用的東西。

回答

1

我的第一個問題是:有人知道我該如何通知web應用程序關於device_id?

最常見的方法是在數據庫(如Firebase數據庫)中存儲設備令牌列表(每個使用FCM的設備都有這樣的令牌)。在Cloud Functions for Firebase documentation中有一個這樣的例子。在這個例子中,接收消息的設備是網頁,但iOS和Android的方法相同。我也推薦閱讀Sending notifications between Android devices with Firebase Database and Cloud Messaging。在本文中,不是發送到設備令牌,而是每個用戶subscribes to a topic。這可以防止在代碼中管理設備令牌。

+0

感謝您的鏈接和示例。這對我來說是一個很好的起點。 :) @FrankvanPuffelen –

相關問題