본문 바로가기

.Net

[Server] GCM 메세지 만들기 및 전송 (C#)

  • GCM 메세지를 만듭니다.

 
        /// <summary> GCM 전송 메세지를 만듭니다.
        /// </summary>
        /// <param name="message"></param>
        /// <param name="deviceId"></param>
        /// <param name="locationUrl"></param>
        /// <returns></returns>
        public string makeMessageForAndroid( string message, string deviceId, string locationUrl)
        {
            StringBuilder requestData = new StringBuilder();
            requestData.Append( "{" );
            requestData.Append( "  \"registration_ids\": [ \"" ).Append(deviceId).Append( "\" ]");
            requestData.Append( ", \"data\": {" );
            requestData.Append( "                 \"message\": \"" ).Append(message).Append( "\"");
            requestData.Append( "               , \"url\": \"" ).Append(locationUrl).Append( "\"");
            requestData.Append( "               , \"regId\": \"" ).Append(deviceId).Append( "\"");
            requestData.Append( " }}" );

            return requestData.ToString();
        }
        /// <summary> Multi GCM 전송 메세지를 만듭니다.(최대 1000개)
        /// </summary>
        /// <param name="message"></param>
        /// <param name="deviceIdList"></param>
        /// <param name="locationUrl"></param>
        /// <returns></returns>
        private IList < String> makeMessageForAndroid( String message, IList < String> deviceIdList, String locationUrl)
        {
            IList <String > messageList = new List <String >();
            IEnumerable <IEnumerable < String>> deviceIdListForList = deviceIdList.Chunk< String >(1000); // GCM으로 최대 1000 개까지 발송가능

            StringBuilder requestData = new StringBuilder();
            String deviceId = String .Empty;
            foreach (var item in deviceIdListForList)
            {
                deviceId = String .Join("\",\"" , item);
                requestData = new StringBuilder ();
                requestData.Append( "{" );
                requestData.Append( "  \"registration_ids\": [ \"" ).Append(deviceId).Append( "\" ]");
                requestData.Append( ", \"data\": {" );
                requestData.Append( "                 \"message\": \"" ).Append(message).Append( "\"");
                requestData.Append( "               , \"url\": \"" ).Append(locationUrl).Append( "\"");
                requestData.Append( " }}" );
                messageList.Add(requestData.ToString());
            }
            return messageList;
        }

  • 메세지를 GCM에 전송합니다.

       /// <summary> GCM으로 안드로이드폰 PUSH를 전송합니다.
        /// </summary>
        /// <param name="postData">GCM 메시지(Json)</param>
        /// <returns></returns>
        public string pushMessageForAndroid( String postData)
        {
            // Message content
            byte [] byteArray = Encoding .UTF8.GetBytes(postData);

            // Create request
            HttpWebRequest req = (HttpWebRequest )WebRequest .Create( "https://android.googleapis.com/gcm/send" );
            req.Method = "POST" ;
            req.KeepAlive = false ;
            req.ContentType = "application/json" ;
            req.Headers.Add( string .Format("Authorization: key={0}" , "api_key"));
            req.ContentLength = byteArray.Length;

            Stream dataStream = req.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //Send message
            WebResponse response = req.GetResponse();
            HttpStatusCode responseCode = ((HttpWebResponse )response).StatusCode;
            if (!responseCode.Equals(HttpStatusCode .Unauthorized) && !responseCode.Equals(HttpStatusCode .Forbidden) && responseCode.Equals( HttpStatusCode .OK))
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());
                string resultJson = reader.ReadToEnd();
                reader.Close();

                return resultJson;
            }
            return "" ;
        }

  • IEnumerable 확장 메소드 - 리스트를 원하는 수만큼 잘라서 리스트를 위한 리스트에 담는다.

        /// <summary>
        /// [Extensions]Break a list of items into chunks of a specific size
         /// </summary>
        public static IEnumerable< IEnumerable <T>> Chunk<T>(this IEnumerable<T> source, Int32 chunksize)
        {
            if (source == null )
                throw new ArgumentNullException( "source" );
            if (chunksize <= 0)
                throw new ArgumentException( "Chunk size must be greater than zero." , "chunksize");

            while (source.Any())
            {
                yield return source.Take(chunksize);
                source = source.Skip(chunksize);
            }
        }