2016년 10월 1일 토요일

C# FCM 푸시 전송 어플리케이션 만들기

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;

        }

    }

   

}






댓글 1개:

박진원 :

안녕하세요! 글써주신대로 만들고있었는데요..
reponse : {"multicast_id":7675125394329567782,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1486704881717304%1a9b95a4f9fd7ecd"}]}
이런식으로 success라고 떴는데...제 폰에는 아무것도 오질 않네요.....ㅠㅠC#으로 짰고, 제 아이폰에 푸쉬 보내려한거에요~ SendNotification(deviceId) <- 이 디바이스 ID와
SERVER_API_KEY <-이 값을 어디서 가져오는지..자세하게 좀 알 수 있을까요??!