Developer/iOS

[IPhone] [APNS] java 로 push notification server 및 클라이언트 구현하기(아이폰 푸시 서버)

블로blow 2011. 4. 5. 17:14
728x90

출처 : http://blog.naver.com/biboi99/90108496796


오늘은 푸시서버를 구현해보도록 할께요

카카오톡이나 많은 SNS서비스를 제공하는 앱들이 해당 기능을 활용하여 통신을 하고 있죠?

 

간단할 것 같지만, 막상 해보면 어디서 시작해서 어떤 방식으로 구현을 해야하는지 막막할 수 있어요

저 또한 그랬고 그래서 많은 서핑들을 하게 되는데, 

 

항상 뭔가 아쉽더라구요.

너무 쉬워서 생략해놓은 곳도 있고 기본이라고 생각하고 그냥 언급하지 않은 내용들 때문에

하나 성공하고 나면 결국 다른걸로 막혀서 또 검색하고,,,  그걸 반복하면. 반나절이 지나가더라구요

 

저 처럼 헤매실 분들을 위하여 정리해보아요~

 

 

 

"렘군와 함께하는 푸시서버 만들기"

 

자~ 한 시간만 따라하면 아이폰으로 "Hello World" 메세지가 뜰 수 있어요~

대신 엄청 집중하셔야 되요~

 

깔끔하게 Action위주로 정리해서 알려드릴께요

(참고로 APNS는 시뮬레이터에서는 테스트 불가능,개발자라이센스 보유하여야 아이폰장비에서 테스트가능)

 

 

 

  가정1 : Provisioning Portal 에서 Certificates, Devices  등록되어 있다는 가정

            만약 안되어 있다면 ->  http://artyst.egloos.com/2650529 참고 (보노님 블로그)

 

  <가정1 요약>

   1. App IDs 등록

   일단, APNS 테스트를 위해서 App등록부터 해야되요. 아직 프로젝트 진행은 아니고 테스트단계니까

   일단 편하게 이름짓자구요. 저는 APNS로 일단 등록했어요

   어디서 하는지 알죠?

   developer.apple.com 사이트 > member center > provision Portal 접속 > App IDs

 

   2. Provisioning 생성

   프로비저닝 명 정해주고, 인증서 선택하고, 1번에서 만든 App ID 선택하고 Devices 선택해주면되죠

 

 

 

 

 

  가정2 : APNS SSL Certificate 발급 받고 xCode 프로젝트속성에 설정 잡았다는 가정

          만약 안되어 있다면 -> http://artyst.egloos.com/2652130 참고 (보노님 블로그)

 

  <가정2 요약>

   1. 푸시 가능 SSL Certificate 를 받아야되요 <- 이게 제일 중요~!! 어플 여러개 개발해봤지만, 여기 숨어있으리라곤 생각못했어요

      App IDs 로 가셔서 APNS 앱 오른쪽에  Configure 클릭 > Enable for Apple Push Notification Service 선택 > Done 버튼 클릭

      -> 이때, 패스워드 설정하실 꺼에요 나중에 서버구현시 필요하니까. 꼭 적어놓으세요

 

   2. Download 해서 SSL Certificate 를 내려받기 (푸시기능이 되는 프로비져닝이죠)

 

   3. xCode 새 프로젝트 생성 > 프로젝트속성에서 code sign 프로비져닝 선택하기

 

   4. 운영서버 구현

       1) APNS 보안통신할 때 사용할 인증서 추출해서 웹서버 특정 폴더에 밑에 복사하기  <- 아주 중요

           (복사방법은 위에 보노님블로그에 기설명됨)

       2) 톰캣 서버 구성 (프로젝트 생성 및 코딩)

 

   5. 클라이언트 구현

 

 

 

1,2,3번까지는 대부분 순조롭게 진행되실꺼구요

4 번 5번은 좀더 구체적으로 들어가볼게요~

 

 

 

4. 운영서버 구현

 

 

<사전준비물>

 

1) 자바 jdk 1.6 설치 : http://www.oracle.com/technetwork/java/javase/downloads/index.html

2) 이클립스 설치 : http://eclipse.org/downloads/

3) 톰캣 설치 : http://tomcat.apache.org/ (6버전)

4) 이클립스 톰캣 플러그인 설치(option) : http://www.eclipsetotale.com/tomcatPlugin.html

 

이클립스 톰캣 설정 방법은 검색을 통해 진행하세요

http://blog.naver.com/ssari93/130086724100 (소토로님 블로그)

http://blog.naver.com/ssari93/130086768842 (소토로님 블로그)

 

 

 

 

 

<프로젝트 생성>

 

1) APNS 라는 이름으로 톰캣 프로젝트 생성하구요, 경로는 이클립스 workspace 밑에 둡니다.

  2) 톰캣 실행시 해당 경로를 홈으로 잡혀야겠죠?

      톰캣이 설치되어 있는 폴더 주소(기본)를 아래와 같이 따라가보시면 아무것도 없을 수 있는데요

      C:\Tomcat 6.0\conf\Catalina\localhost

      여기에 아래의 내용을 담아 프로젝트명.xml 파일을 만들어 주세요 (ex apns.xml) (톰캣프로젝트 생성하면 자동으로 생성되는 경우도 있음)

      <Context path="/apns" reloadable="true" docBase="E:\eclipse\workspace\apns"     

       workDir="E:\eclipse\workspace\apns\work" />

      이게 없으면 http://localhost:8080/apns/index.jsp 이렇게 호출 했을 때 해당 프로젝트를 정확히 인식할 수 없어요

 

  3) 톰캣 프로젝트 바로 아래에 index.jsp 파일 하나 생성해주시구요 Hello world 적고 출력해보세요

      http://localhost:8080/apns/index.jsp  (포트는 톰캣 server.xml 설정에 따라 달라 질 수 있어요)

      이게 제대로 나온다면 이제 코딩들어가죠

 

  4) 첨부파일 다운로드 받아서 압축을 풀면 lib 폴더가 나오는데, 해당 폴더 아래의 내용들을

     eclipse\workspace\apns\WEB-INF\lib 폴더에 copy 해주세요

     APNS서버 구성을 위해 필요한 라이브러리들입니다. (개별로 서핑해서 찾으실려면 고생하실까봐 첨부했어요)

        javapns
      log4j
      bcprov-ext
      commons-io
      commons-lang

 

 

 

 

 

<index.jsp 코딩>

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
 
<%@ page import="javapns.back.PushNotificationManager" %>   
<%@ page import="javapns.back.SSLConnectionHelper" %>   
<%@ page import="javapns.data.Device" %>   
<%@ page import="javapns.data.PayLoad" %>   
<%@ page import="java.lang.Object" %>   
<%@ page import="org.apache.commons.lang.StringUtils" %>   

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>

<%
 
System.out.println( "start~~!!!" );

 

 

String deviceToken = "4a525b59 273042ce ba95afae eb09db8f 2782ed06 cb5370b9 a57c02d1 fd6cf11d";   

//토큰 번호는 아이폰 클라이언트  구현 후 디버그 모드로 출력하면 알 수 있어요. 아래 5번 클라이언트구현 글 참고

 

PayLoad payLoad = new PayLoad();

payLoad.addAlert("hello kim, 반가워~!!");    // 아이폰에 통지 보낼 메세지 내용입니다.
payLoad.addBadge(1);
payLoad.addSound("default");                  
  
PushNotificationManager pushManager = PushNotificationManager.getInstance();


pushManager.addDevice("iPhone", deviceToken);
  
//Connect to APNs
String host = "gateway.sandbox.push.apple.com";
int port = 2195;
String certificatePath = "E:/eclipse/workspace/apns/ApnsCert.p12";     // 위에 가정2 4번에 설명한 부분이에요, 복사해놓은 경로명+파일명

String certificatePassword = "APNS인증서 패스워드";                                           // 위에 가정2 1번 부분에 설명한 패스워드에요

pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

 
//Send Push
Device client = pushManager.getDevice("iPhone");

pushManager.sendNotification(client, payLoad);

pushManager.stopConnection();

pushManager.removeDevice("iPhone");


%>

please wait ...!


</body>
</html>

 

 

 

 

(빨간 색 부분만 변경하시면되요)

 

 

5. 클라이언트 구현

 

 

아이군님의 블로그에 설명이 너무나 잘 되어 있어서 링크 걸어요

http://theeye.pe.kr/entry/how-to-programming-push-notification-on-my-iphone-with-javapns

 

<내용 요약>

APNS 관련 함수들 몇가지면 수정해주시면되요

- (void)application:(UIApplication *)application  
    didRegisterForRemoteNotificationsWithDeviceToken
:(NSData *)deviceToken

 

- (void)application:(UIApplication *)application 
    didReceiveRemoteNotification
:(NSDictionary *)userInfo 

 

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions
:(NSDictionary *)launchOptions  

 

 

 

일단, 구현은 다 되었네요. 테스트를 해봐야 하는데요

 

 

 

<테스트방법>

1. 맥북에 아이폰 연결 후 실행모드(Device) 변경 해서 실행 (폰에 설치되고 실행됩니다. 화면에는 회색 화면만 뜨겠죠)

2. http://localhost:8080/apns/index.jsp  pc 브라우저에 해당 페이지 호출

3. 몇 초 후 아이폰에 푸시메시지 들어옴 확인

   어플이 실행중이지 않을 경우 닫기/보기 버튼 중 보기버튼을 누르면 해당 어플이 뜹니다.

 

 

메세지가 잘 들어왔나요?

한번만에 되신 분은 정말... 존경~!!

 

저는 톰캣 설정하는 것부터 오랫만에 해보는 거라 많이 헤맸거든요 ^^;

처음부터 다시 꼼꼼히 살펴보시면~~~  되실거에요

 

일단, 무작정 따라하기로 통보는 정상적으로 들어왔네요~!

 

이제 앞으로 몇가지 응용을 더 해봐야겠죠?

 

특정인에게만 통보 하기~

통보 받은 걸 화면에 대화창에 보여주기~

메신저 비스무리해보이는 어플 만들어보기~

 

 

완성되는 대로 포스팅할께요~~!!

긴글 읽어주셔서 감사합니다.

 

728x90