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;

        }

    }

   

}






댓글 9개:

메론 :

안녕하세요! 글써주신대로 만들고있었는데요..
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 <-이 값을 어디서 가져오는지..자세하게 좀 알 수 있을까요??!

sparrow :

https://firebase.google.com/docs/guides/?hl=ko

구글 FCM 안드로이드/iOS 앱을 등록 하고 KEY를 부여 받아야 합니다. 블로그 관리가 소홀해서 이제야 댓글을 답니다.

Unknown :

안녕하세요, c#으로 FCM 모듈을 만들어보려고 하고 있습니다.

댓글에 써주신대로 FCM에 앱 등록하고 키도 받았는데

윈폼이 처음이라..본문에 있는 코드를 어떻게 써야하며.. 깃허브에서받은 소스는 어떻게 써야하는지

하나도 감이 안와서요..

접근방법 좀 부탁드립니다ㅠㅠ

외주코딩맨 :

갈끔한 정리 감사합니다. 검색좀 많이 해야 할것 같았는데 한방에 되네요^^

Unknown :

안녕하세요~! 좋은자료 감사합니다!
코드가 제대로 작동하지 않아서 질문 드립니다...ㅠㅠ
올려주신코드 그대로 따라서 했는데 C#에서

예외 발생: 'System.Net.WebException'(System.dll)
원격 서버에서 (401) 권한이 없음 오류를 반환했습니다.

이런 에러가 뜹니다.
혹시 해결법을 아신다면 답변 부탁드립니다.

Unknown :

안녕하세요~! 좋은자료 감사합니다~!
코드를 따라해보다가 작동이 잘 안되서어 질문드립니다...ㅠㅠ
C#에서

예외 발생: 'System.Net.WebException'(System.dll)
원격 서버에서 (401) 권한이 없음 오류를 반환했습니다.

이런 에러가 뜨는데 혹시 해결방법을 아시나요...ㅠㅠ

sparrow :

구글에서 C# 가이드가 추가 되었습니다.

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko#c_1

익명 :

서버측에서 device id를 얻어오는 방법은 없나요?
일일이 클라이언트에서 토큰값을 얻어서 서버에
전달할 수는 없는데..

익명 :


감사합니다. 많은 도움이 되었습니다.
단지 그대로 쓰면 'null' 만 전송이 되더라구요.
아래와 같이 고치니 정상 동작 합니다.

var postData =
new
{
notification = new '기존 data = new
{
title = textBox1.Text,
body = message,
},

// FCM allows 1000 connections in parallel.
to = deviceId
};