지하 깊숙한곳부터 삽질해서 만들지는 않았다.
언제나 그렇듯 개발을 시작하기 전에는 해결하고자 하는 문제에대한 손쉬운 해결책을 검색하게 된다.
눈앞에있는 문제의 본질이 원리를 깨닫고 더 나아가는 것이 아니라면 나는 언제나 오픈소스를 활용한다.
그렇게 세이브한 시간을 좀더 재미있는 일에 투자한다. 각설하고!

http://code.google.com/p/javapns 에 가면 Java로 APNS를 보낼 수 있는  오픈소스가 있다.
예제 코드가 잘되어 있고 사용도 쉬워서 javapns를 이용하기로 결정했다.
아래는 간단히 Wrapping한 코드이다.

import javapns.back.PushNotificationManager;

import javapns.back.SSLConnectionHelper;

import javapns.data.Device;

import javapns.data.PayLoad;


public class JavapnsTest {

public static int RUN_MODE_DEVELOPMENT = 1;

public static int RUN_MODE_PRODUCTION = 2;

public void sendApns(int runMode, String deviceToken, String alertMessage, int badgeCount, String soundFile) throws Exception {

try {

PayLoad payLoad = new PayLoad();

payLoad.addAlert(alertMessage);

payLoad.addBadge(badgeCount);

payLoad.addSound(soundFile);


PushNotificationManager pushManager = PushNotificationManager.getInstance();

pushManager.addDevice("iPhone", deviceToken);


String host = null;

String certificatePath = null;

if (runMode == RUN_MODE_DEVELOPMENT) {

host = "gateway.sandbox.push.apple.com";

certificatePath = "./keystore/your_apns_development_key.p12";

} else if (runMode == RUN_MODE_PRODUCTION) {

host = "gateway.push.apple.com";

certificatePath = "./keystore/your_apns_production_key.p12";

}

int port = 2195;

String certificatePassword = "Your password";

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


Device client = pushManager.getDevice("iPhone");

pushManager.sendNotification(client, payLoad);

pushManager.stopConnection();


pushManager.removeDevice("iPhone");

} catch (Exception ex) {

ex.printStackTrace(); 

}

}

public static void main(String... args) throws Exception{

JavapnsTest apns = new JavapnsTest();

apns.sendApns(

RUN_MODE_DEVELOPMENT,

"5c0de8bdc3414816a0eb728751f76be119e9a705e43cdbf0ed16c1772a63218a",

"Test삼~",

9999,

"default");

}

}




정말 간단하다 -ㅅ-; 굳이 설명할 가치도 못느끼겠다.
간단하게 파라미터만 설명 해보자.

1. runMode : APNS는 Development용과 Production용을 구별하고 있다. 그것에 따라서 사용해야하는 키와 게이트웨이가 다르다.

2. deviceToken : 특정 디바이스에 특정 앱에 부여되는 APNS를 위한 고유값 정도로 알아두자. 이값은 유니크하지만 불변의 값은 아니다. 64자리의 문자열 값이다. 앱에서 아래와 같은 방법으로 얻을 수 있다.

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:

(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

....

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {

#if !TARGET_IPHONE_SIMULATOR

// ' ', '<', '>' 제거

    NSString *deviceToken = [[[[devToken descriptionstringByReplacingOccurrencesOfString:@"<" withString:@""stringByReplacingOccurrencesOfString:@">" withString:@""stringByReplacingOccurrencesOfString:@" " withString:@""];

NSLog(@"deviceToken : %@", deviceToken);

#endif


3. alertMessage : 노티를 받았을 때 뜨는 알럿창의 메세지다.

4. badgeCount : 스프링보드 아이콘에 붙는 빨콩안의 숫자값이다.

5. soundFile : 노티를 받았을 때 재생되는 사운드 파일명이다. 자세한 내용은 깔끔하게 까먹었다.


APNS에 Custom key-value를 추가 할 수 있지만, 이런 부분까지는 각자의 몫으로 하자!

APNS 자체에대해서 궁금하다면 Apple의 문서를 참고하자. 
p12파일을 만드는 방법이 궁금하다면 여기를 참고하자.




저작자 표시
신고

'Java' 카테고리의 다른 글

Java7 Certificates does not conform to algorithm constraints  (0) 2014.03.22
Java APNS 인증키 생성  (0) 2011.05.31
Java로 APNS 및 Feedback  (0) 2011.03.24
Java로 애플 푸시 알림 보내기  (1) 2011.03.23
Posted by 지오아빠^^
TAG , ,






티스토리 툴바