Android
2018.06.20 / 03:18

JAVA·Î GCM, APNS »ç¿ëÇϱâ

¸®¾ó¸®
Ãßõ ¼ö 182

º» Æ÷½ºÆÃÀº java ¼­¹ö ±â¹ÝÀ¸·Î apns, gcmÀ» È°¿ëÇØ ¸ð¹ÙÀÏ ±â±â·Î PUSH ¸Þ¼¼Áö¸¦ Àü¼ÛÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù.

¸ð¹ÙÀÏ ±â±â ´Ü¿¡¼­ ó¸® ÄÚµå´Â Æ÷ÇÔÇÏÁö ¾Ê½À´Ï´Ù :)


1. APNS »ç¿ëÇϱâ

¾ÖÇÃÀÇ ¾ÆÀÌÆù µîÀÇ ±â±â¿¡ PUSH ¸Þ¼¼Áö¸¦ Àü¼ÛÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº Áغñ¹°ÀÌ ÇÊ¿äÇÕ´Ï´Ù.


* javaPNS ¶óÀ̺귯¸® : http://code.google.com/p/javapns/

* javaPNS¿¡¼­ »ç¿ëÇÏ´Â Bouncy Castle ¶óÀ̺귯¸® : http://www.bouncycastle.org/

* PUSH ÀÎÁõ¼­/ÀÎÁõ¼­ ºñ¹Ð¹øÈ£

* µð¹ÙÀ̽º UDID

* ¸ð¹ÙÀϾÛ


javaPNS´Â Apple Push Notification Service(APNS)¸¦ »ç¿ëÇϱ⠽±°Ô ¸¸µé¾îÁø ¿ÀǼҽº ¶óÀ̺귯¸®·Î GNU Lesser GPL ¶óÀ̼±½º¸¦ µû¸¨´Ï´Ù. 


º» Æ÷½ºÆÿ¡¼­ »ç¿ëµÇ´Â javaPNS ¹öÀüÀº 2.2 ÀÔ´Ï´Ù. 

JVM ¹öÀüÀº 1.5 ÀÌ»óÀ» ¾²¸é µÇÁö¸¸ ÇöÀç 1.7 ¹öÀü¿¡¼­´Â SSL connection¿À·ù°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ½¿¡ ÁÖÀÇÇÕ´Ï´Ù. 

¶ÇÇÑ javaPNS´Â BouncyCastle¿¡¼­ Á¦°øÇÏ´Â ¾Ïº¹È£È­ ¶óÀ̺귯¸®¿¡ ÀÇÁ¸¼ºÀÌ ÀÖ½À´Ï´Ù. BouncyCastle¸¦ ¿ÂÀüÈ÷ »ç¿ëÇϱâ À§Çؼ­´Â JCE Policy ÆÄÀÏ ÆÐÄ¡°¡ ÇÊ¿äÇÒ ¼ö ÀÖ½À´Ï´Ù.


ÀÌ»ó À§ Áغñ°úÁ¤À» ¸¶ÃÆ´Ù¸é, APNS´Â ¾ÆÁÖ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

±âº» ÄÚµå´Â ¾Æ·¡¿Í °°½À´Ï´Ù.

  1. public boolean send(String certificate, String password, boolean production, String udid, String message, Map<String, String> extra) {  
  2.     try {  
  3.         PushNotificationPayload payload = PushNotificationPayload.complex();  
  4.         payload.addAlert(message);  
  5.         payload.addBadge(-1);  
  6.         payload.addSound("default");  
  7.               
  8.         if( extra != null ) {  
  9.             Iterator<String> keys = extra.keySet().iterator();  
  10.             while( keys.hasNext() ) {  
  11.                 String key = keys.next();  
  12.                 String value = extra.get(key);  
  13.                   
  14.                 payload.addCustomDictionary(key, value);  
  15.             }  
  16.         }  
  17.   
  18.         PushedNotifications notifications = Push.payload(payload,   
  19.                 certificate, password, production, udid);  
  20.               
  21.         return (notifications != null && notifications.size() > 0 && notifications.get(0).isSuccessful());  
  22.               
  23.     } catch (Exception e) {  
  24.         logger.error(e, e);  
  25.     }   
  26.           
  27.     return false;  
  28. }  

certificate´Â ÀÎÁõ¼­ °æ·Î, password´Â ÀÎÁõ¼­ ºñ¹Ð¹øÈ£, udid´Â µð¹ÙÀ̽º °íÀ¯Å° ÀÔ´Ï´Ù.

extra´Â Àü¼Û ¸Þ¼¼Áö ¿Ü¿¡ Ä¿½ºÅÒ µñ¼Å³Ê¸®¿¡ ³ÖÀ» µ¥ÀÌÅ͸¦ ó¸®ÇÕ´Ï´Ù.


APNS Àü¼ÛÀÌ ¼ö ¸¸°Ç ´ÜÀ§·Î ¸¹¾ÆÁú °æ¿ì À§ Äڵ带 ±×´ë·Î »ç¿ëÇÏ´Â °ÍÀº ¸Å¿ì ºñÈ¿À²ÀûÀÔ´Ï´Ù.  


APNSÀÇ °æ¿ì Çѹø Ä¿³Ø¼ÇÀÌ ¸Î¾îÁú °æ¿ì ÇØ´ç Ä¿³Ø¼ÇÀ» ÅëÇØ ´Ù¼öÀÇ PUSH µ¥ÀÌÅ͸¦ Çѹø¿¡ Àü¼ÛÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ÇÊ¿ä¿¡ µû¶ó ¸ÖƼ¾²·¹µå ¹æ½ÄÀ» ÅëÇØ PUSH µ¥ÀÌÅ͸¦ ³ª´©¾î Àü¼ÛÇÒ ¼öµµ ÀÖ½À´Ï´Ù. 


Message Broadcasting, payloadPerDevice, multithread, connection pool°ú °°Àº °í±Þ ÁÖÁ¦µé ¶ÇÇÑ javaPNS ¹®¼­¿Í ¼Ò½º¿¡¼­ ÈùÆ®¸¦ ¾òÀ» ¼ö ÀÖÀ¸´Ï ¹Ýµå½Ã Âü°íÇϱ⸦ ±ÇÀåÇÕ´Ï´Ù.



2. Google Cloud Messaging for Android(GCM) »ç¿ëÇϱâ

GCMÀ» »ç¿ëÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº Áغñ¹°ÀÌ ÇÊ¿äÇÕ´Ï´Ù.


* Google API ConsoleÀ» ÅëÇØ ÇÁ·ÎÁ§Æ® »ý¼º

* GCM È°¼ºÈ­

* API Key ¹× ÇÁ·ÎÁ§Æ® ID ¾ò±â

* µð¹ÙÀ̽º ÅäÅ«

* ¸ð¹ÙÀÏ ¾Û

* gmc-server ¶óÀ̺귯¸®

* json-simple ¶óÀ̺귯¸®


¸ÕÀú https://code.google.com/apis/console/ ¿¡ óÀ½ ¹æ¹®ÇÏ¸é ´ÙÀ½ ±×¸²°ú °°ÀÌ ÇÁ·ÎÁ§Æ®¸¦ °³¼³Çϱâ À§ÇÑ °úÁ¤ÀÌ ³ªÅ¸³³´Ï´Ù.


ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑÈÄ ÁÂÃø ¸Þ´ºÀÇ Services¿¡¼­ "Google Cloud Messaging for Android"¸¦ È°¼ºÈ­ ÇØÁÝ´Ï´Ù.



±× ´ÙÀ½ ÁÂÃø ¸Þ´ºÀÇ API Access¿¡¼­ ¾Æ·¡ ±×¸²°ú °°ÀÌ Create New Server Key¸¦ »ý¼ºÇÕ´Ï´Ù.



¼­¹ö Å°¸¦ »ý¼ºÇϸ鼭 Á¢±Ù °¡´ÉÇÑ ¼­¹öÀÇ IP¸¦ ÀÔ·ÂÇÏ´Â °úÁ¤ÀÌ ÀÖ½À´Ï´Ù. 

Á¤»óÀûÀ¸·Î ¼­¹ö Å°°¡ »ý¼º?ç´Ù¸? ¾Æ·¡¿Í °°ÀÌ APIÅ°¿Í Çã¿ë IP¸ñ·ÏÀ» È®ÀÎÇÒ ¼ö ÀÖ¾¹´Ï´Ù.



ÇÁ·ÎÁ§Æ® ID´Â ´ÙÀ½ ±×¸²°ú °°ÀÌ URLÀÇ project: ´ÙÀ½ÀÇ ÀϷùøÈ£¸¦ ÅëÇØ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.



gcm-server ¶óÀ̺귯¸®´Â ¾Èµå·ÎÀ̵å SDKÀÇ extras > google > gcm > gcm-server > dist ¿¡¼­ ãÀ» ¼ö ÀÖ¾¹´Ï´Ù.

¸¸¾à gcmÀÌ ¾ø´Ù¸é ¾Èµå·ÎÀ̵å SDK ¸Å´ÏÀú¸¦ ÅëÇØ ¼³Ä¡ÇؾßÇÕ´Ï´Ù.


gcm-server´Â json-simple ¶óÀ̺귯¸®¿¡ ÀÇÁ¸¼ºÀÌ ÀÖ½À´Ï´Ù. 

json-simpleÀº http://code.google.com/p/json-simple/ ¿¡¼­ ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.


±âº» ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.

  1. public boolean send(String apiKey, String token, String message, Map<String, String> extra) {  
  2.     Sender sender = new Sender(apiKey);  
  3.           
  4.     try { message = URLEncoder.encode(message, "UTF-8"); }   
  5.     catch (UnsupportedEncodingException ignore) {}  
  6.           
  7.     Message.Builder messageBuilder = new Message.Builder();   
  8.     messageBuilder.delayWhileIdle(false);  
  9.     messageBuilder.timeToLive(1800); // 30min  
  10.     messageBuilder.addData("msg", message);  
  11.           
  12.     if( extra != null ) {  
  13.         Iterator<String> keys = extra.keySet().iterator();  
  14.         while( keys.hasNext() ) {  
  15.             String key = keys.next();  
  16.             String value = extra.get(key);  
  17.                   
  18.             messageBuilder.addData(key, value);  
  19.         }  
  20.     }  
  21.           
  22.     try {  
  23.         Result result = sender.send(messageBuilder.build(), token, 5);  
  24.         String messageId = result.getMessageId();  
  25.               
  26.         return (messageId!=null);  
  27.     } catch(Exception e) {  
  28.         logger.error(e, e);  
  29.     }             
  30.           
  31.     return false;  
  32. }  

APNS¿Í ¸¶Âù°¡Áö·Î ¸¹Àº ¾çÀÇ PUSH ¸Þ¼¼Áö¸¦ À§ Äڵ带 ÅëÇØ Ã³¸®ÇÏ´Â °ÍÀº ¸Å¿ì ºñÈ¿À² ÀûÀÔ´Ï´Ù.


C2DM¿¡¼­ GCMÀ¸·Î ³Ñ¾î¿À¸ç ¾òÀ» ¼ö ÀÖ´Â Å« ÀåÁ¡ÁßÀÇ Çϳª´Â Message BroadcastingÀÌ °¡´ÉÇØÁ³´Ù´Â °ÍÀÔ´Ï´Ù.

¾ÆÁ÷ °æÇèÀû/Åë°èÀûÀ¸·Î GCM ¿¡¼­ÀÇ ÀûÀýÇÑ connection°ú multithread °¹¼ö´Â ÆľÇÇÏÁö ¸øÇßÁö¸¸, Message Broadcasting ±â¼ú°ú delayWhileIdle, timeToLiveÀÇ ¼³Á¤°ªÀ» ÅëÇØ PUSH ¸Þ¼¼Áö µµ´ÞÀ²À» C2DMº¸´Ù ³ôÈú ¼ö ÀÖÀ»°ÍÀ̶ó ±â´ëÇÕ´Ï´Ù. 




Ãâó: http://lyb1495.tistory.com/90 [helloworld]