Java로 APNS 및 Feedback

Java 2011.03.24 17:04
크리에이티브 커먼즈 라이선스
Creative Commons License
지난번 포스팅에서 Java로 APNS 요청을 하는 방법을 다뤘었다.
이 포스팅은 지난번 포스팅의 연장선상에 있다.

 만약 APNS 요청을 했는데 사용자가 앱을 지우거나 하여 APNS를 보낼 수 없는 상태라면 어떻게 된까?
APNS 서버는 APNS Feedback 서버에 deviceToken을 등록하여 Service Provider들이 이를 확인할 수 있도록 하고 있다.

지난번 포스팅의 코드에 추가했다.

import javapns.back.PushNotificationManager;

import javapns.back.FeedbackServiceManager;

import javapns.back.SSLConnectionHelper;

import javapns.data.Device;

import javapns.data.PayLoad;


import java.util.*;


public class JavapnsTest {

public static int RUN_MODE_DEVELOPMENT = 1;

public static int RUN_MODE_PRODUCTION = 2;

public static String APNS_DEVELOPMENT_GATEWAY = "gateway.sandbox.push.apple.com";

public static String APNS_PRODUCTION_GATEWAY = "gateway.push.apple.com";

public static String APNS_DEVELOPMENT_FEEDBACK = "feedback.sandbox.push.apple.com";

public static String APNS_PRODUCTION_FEEDBACK = "feedback.push.apple.com";

// Change Here.

public static String APNS_DEVELOPMENT_KEY = "./keystore/your_apns_development_key.p12";

public static String APNS_PRODUCTION_KEY = "./keystore/your_production_key.p12";

public static String APNS_DEVELOPMENT_KEY_PASSWORD = "YOUR DEVELOPMENT PASSWORD";

public static String APNS_PRODUCTION_KEY_PASSWORD = "YOUR DEVELOPMENT PASSWORD";

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


int port = 2195;

String host = null;

String certificatePath = null;

String certificatePassword = null;

if (runMode == RUN_MODE_DEVELOPMENT) {

host = APNS_DEVELOPMENT_GATEWAY;

certificatePath = APNS_DEVELOPMENT_KEY;

certificatePassword = APNS_DEVELOPMENT_KEY_PASSWORD;

} else if (runMode == RUN_MODE_PRODUCTION) {

host = APNS_PRODUCTION_GATEWAY;

certificatePath = APNS_PRODUCTION_KEY;

certificatePassword = APNS_PRODUCTION_KEY_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 ArrayList<String> sendFeedback(int runMode) {

ArrayList<String> deviceTokens = new ArrayList<String> ();

try {

int port = 2196;

String host = null;

String certificatePath = null;

String certificatePassword = null;

if (runMode == RUN_MODE_DEVELOPMENT) {

host = APNS_DEVELOPMENT_FEEDBACK;

certificatePath = APNS_DEVELOPMENT_KEY;

certificatePassword = APNS_DEVELOPMENT_KEY_PASSWORD;

} else if (runMode == RUN_MODE_PRODUCTION) {

host = APNS_PRODUCTION_FEEDBACK;

certificatePath = APNS_PRODUCTION_KEY;

certificatePassword = APNS_PRODUCTION_KEY_PASSWORD;

}

FeedbackServiceManager feedbackManager = FeedbackServiceManager.getInstance();

LinkedList<Device> devices = feedbackManager.getDevices(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

if (devices.size() > 0) {

ListIterator<Device> itr = devices.listIterator();

while (itr.hasNext()) {

Device device = itr.next();

deviceTokens.add(device.getToken());

}

}

} catch (Exception ex) {

ex.printStackTrace();

}

return deviceTokens;

}

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

JavapnsTest apns = new JavapnsTest();

apns.sendApns(

RUN_MODE_DEVELOPMENT,

"deviceToken",

"Test~",

9999,

"default");

ArrayList<String> deviceTokens = apns.sendFeedback(RUN_MODE_DEVELOPMENT);

for (String deviceToken : deviceTokens) {

System.out.println(deviceToken);

}

}

}


 
sendFeedback을 테스트 해보기 위해서는 아래의 절차를 따라야 한다.

1. 앱을 설치한다.
2. 앱에서 APNS 사용하도록 등록한다.
3. 앱을 삭제한다.
4. 앱에 APNS 요청 : 이때 실패가 되면서 APNS서버는 APNS Feedback 서버에 요청했던 deviceToken값을 등록한다.
5. APNS Feedback 서버에서 deviceToken을 조회하여 해당 deviceToken에 더이상 APNS요청을 하지 않도록 설정한다. 

Feedback기능을 특정 APNS요청 전후로 메세지 송신여부를 알아올 수 있는 편리한 기능으로 오해하고 있었다.
인생 장밋빛 라이더스~ 흠냐.. 

Feedback 을 주기적으로 해서 받아온 deviceToken 들을 APNS요청 대상에서 제외시켜주자.
이것도 그린 컴퓨팅인가? 

 
저작자 표시
신고

'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 지오아빠^^






티스토리 툴바