FCM firebase Cloud Message
https://firebase.google.com/docs/cloud-messaging/?hl=ko
GCM에서 FCM으로 변경 되고 있다.
푸시를 전송 하는 것은 구글 사이트에 요청 하면 된다.
결국 http url request 를 하면 되는 것이고 그것을 어떠한 언어로든 구현 하면 된다.
전송되는 메세지는 json 포멧으로 전달 하면 된다.
이런 것을 지원 해주는 앱으로 구글 포스트 맨도 있다.
https://www.getpostman.com
FCM으로 변경되면서 직접 테스트로 push를 발송 해보는 페이지도 있으니 사실 테스트 어플리케이션이나 포스트맨 어플은 필요 없을수도 있다.
하지만 이번에 개발을 하면서 이미 구현된 서버가 C#으로 구현되어 있다.
모바일 앱과 동작 하는 앱서버가 C#으로 구현 되어 있고
여기에 푸시 기능을 추가 하려 하니 당연히 C# 코드가 필요 했다.
https://github.com/UniverseBryan/FCMWinServer
여기 코드를 참고 해서 간단한 윈폼 어플을 개발 해 보았다.
C#언어로 개발 해본 경험이 없지만
아주 생산성이 좋은듯 하다. 그동안 M$ 개발툴을 너무 멀리 하고 있었는데.
최근 파이썬을 비줠스튜디오로 만지면서 비줠스튜디오 커뮤니티 에디션을 조금 만저 봣는데
나름 C#도 생산성이 좋은 언어 인듯 하다.
아래의 코드가 푸시 전송 코드이다.
폼에 텍스트 입력 두개와 버튼 하나를 언지고
git에서 어든 dll파일을 추가해서 참조에 추가 하고 아래의 코드를 폼 코드에 추가 하면 된다.
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Diagnostics;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string res = SendNotification("app registration token key string 152 bytes here", textBox2.Text);
}
public string SendNotification(string deviceId, string message)
{
string SERVER_API_KEY = "API KEY STRING";
var value = message;
string resultStr = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://fcm.googleapis.com/fcm/send");
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8;";
request.Headers.Add(string.Format("Authorization: key={0}", SERVER_API_KEY));
var postData =
new
{
data = new
{
title = textBox1.Text,
body = message,
},
// FCM allows 1000 connections in parallel.
to = deviceId
};
//Linq to json
string contentMsg = JsonConvert.SerializeObject(postData);
Debug.WriteLine("contentMsg = " + contentMsg);
Byte[] byteArray = Encoding.UTF8.GetBytes(contentMsg);
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
try
{
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
resultStr = reader.ReadToEnd();
Debug.WriteLine("response: " + resultStr);
reader.Close();
responseStream.Close();
response.Close();
}
catch (Exception e)
{
resultStr = "";
Debug.WriteLine(e.Message);
}
return resultStr;
}
}
}