- 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);
}
} |