º» Æ÷½ºÆÃÀº 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´Â ¾ÆÁÖ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
±âº» ÄÚµå´Â ¾Æ·¡¿Í °°½À´Ï´Ù.
- public boolean send(String certificate, String password, boolean production, String udid, String message, Map<String, String> extra) {
- try {
- PushNotificationPayload payload = PushNotificationPayload.complex();
- payload.addAlert(message);
- payload.addBadge(-1);
- payload.addSound("default");
-
- if( extra != null ) {
- Iterator<String> keys = extra.keySet().iterator();
- while( keys.hasNext() ) {
- String key = keys.next();
- String value = extra.get(key);
-
- payload.addCustomDictionary(key, value);
- }
- }
-
- PushedNotifications notifications = Push.payload(payload,
- certificate, password, production, udid);
-
- return (notifications != null && notifications.size() > 0 && notifications.get(0).isSuccessful());
-
- } catch (Exception e) {
- logger.error(e, e);
- }
-
- return false;
- }
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/ ¿¡¼ ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.
±âº» ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.
- public boolean send(String apiKey, String token, String message, Map<String, String> extra) {
- Sender sender = new Sender(apiKey);
-
- try { message = URLEncoder.encode(message, "UTF-8"); }
- catch (UnsupportedEncodingException ignore) {}
-
- Message.Builder messageBuilder = new Message.Builder();
- messageBuilder.delayWhileIdle(false);
- messageBuilder.timeToLive(1800);
- messageBuilder.addData("msg", message);
-
- if( extra != null ) {
- Iterator<String> keys = extra.keySet().iterator();
- while( keys.hasNext() ) {
- String key = keys.next();
- String value = extra.get(key);
-
- messageBuilder.addData(key, value);
- }
- }
-
- try {
- Result result = sender.send(messageBuilder.build(), token, 5);
- String messageId = result.getMessageId();
-
- return (messageId!=null);
- } catch(Exception e) {
- logger.error(e, e);
- }
-
- return false;
- }
APNS¿Í ¸¶Âù°¡Áö·Î ¸¹Àº ¾çÀÇ PUSH ¸Þ¼¼Áö¸¦ À§ Äڵ带 ÅëÇØ Ã³¸®ÇÏ´Â °ÍÀº ¸Å¿ì ºñÈ¿À² ÀûÀÔ´Ï´Ù.
C2DM¿¡¼ GCMÀ¸·Î ³Ñ¾î¿À¸ç ¾òÀ» ¼ö ÀÖ´Â Å« ÀåÁ¡ÁßÀÇ Çϳª´Â Message BroadcastingÀÌ °¡´ÉÇØÁ³´Ù´Â °ÍÀÔ´Ï´Ù.
¾ÆÁ÷ °æÇèÀû/Åë°èÀûÀ¸·Î GCM ¿¡¼ÀÇ ÀûÀýÇÑ connection°ú multithread °¹¼ö´Â ÆľÇÇÏÁö ¸øÇßÁö¸¸, Message Broadcasting ±â¼ú°ú delayWhileIdle, timeToLiveÀÇ ¼³Á¤°ªÀ» ÅëÇØ PUSH ¸Þ¼¼Áö µµ´ÞÀ²À» C2DMº¸´Ù ³ôÈú ¼ö ÀÖÀ»°ÍÀ̶ó ±â´ëÇÕ´Ï´Ù.