Допустим есть некая конфигурация, которая крутится на Сервере. Есть необходимость в том, чтобы при наступлении какого-либо события на Сервере была инициирована, например, синхронизация с мобильным устройством. На самом деле можно придумать любой другой пример, но суть в том, что инициатива какого-либо действия должна быть именно со стороны Сервера а не с мобилы. Сигналом к действию для мобилы и будет выступать push сообщение.
В моем случае такое событие возникает в момент, когда торговая пара криптовалют на бирже Binance изменяет цену на некий заданный %
Alert a = new Alert(c.ID);
if(a.got_to_be_pushed)
{
Push push = new Push(a);
push.Send();
}
А вот и сам класс Push, в котором можно добавить любые атрибуты пуша, включая звук, иконку, действия по нажатию и так далее
using System;
using System.IO;
using System.Net;
using System.Text;
using Newtonsoft.Json;
namespace CryptoAlertWF
{
class Push
{
private string SERVER_KEY = Global.FireBase_PUSH_SERVER_KEY;
private Alert alert;
public Push(Alert a)
{
alert = a;
}
public bool Send()
{
FireBasePush push = new FireBasePush(SERVER_KEY);
dynamic r = push.SendPush(new PushMessage()
{
to = alert.FcmToken,
content_available = true,
priority = "high",
notification = new PushMessageData
{
title = alert.Title,
body = alert.Body,
sound = alert.Sound,
badge = alert.Badge
}
});
alert.SavePushResult(r);
return r.success == 1;
}
}
public class FireBasePush
{
private string FIREBASE_URL = "https://fcm.googleapis.com/fcm/send";
private string KEY_SERVER;
public FireBasePush(String key_server)
{
this.KEY_SERVER = key_server;
}
public dynamic SendPush(PushMessage message)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(FIREBASE_URL);
request.Method = "POST";
request.Headers.Add("Authorization", "key=" + this.KEY_SERVER);
request.ContentType = "application/json";
string json = JsonConvert.SerializeObject(message);
byte[] byteArray = Encoding.UTF8.GetBytes(json);
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.Accepted || response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
{
StreamReader read = new StreamReader(response.GetResponseStream());
String result = read.ReadToEnd();
read.Close();
response.Close();
dynamic stuff = JsonConvert.DeserializeObject(result);
return stuff;
}
else
{
throw new Exception("An error has occurred when try to get server response: " + response.StatusCode);
}
}
}
public class PushMessage
{
private string _to;
private bool _content_available;
private string _priority;
private PushMessageData _notification;
public string to
{
get { return _to; }
set { _to = value; }
}
public bool content_available
{
get { return _content_available; }
set { _content_available = value; }
}
public string priority
{
get { return _priority; }
set { _priority = value; }
}
public PushMessageData notification
{
get { return _notification; }
set { _notification = value; }
}
}
public class PushMessageData
{
private string _title;
private string _body;
private string _sound;
private int _badge;
public string sound
{
get { return _sound; }
set { _sound = value; }
}
public string title
{
get { return _title; }
set { _title = value; }
}
public string body
{
get { return _body; }
set { _body = value; }
}
public int badge
{
get { return _badge; }
set { _badge = value; }
}
}
}
C# Class to Send PUSH Notifications