아니 왜.. 갑작스럽게 필요해서 프로바이더 소스를 막 찾아보는데
뭐 막 인증서 만들고, 키만들어서 .pem 으로 만들고 그걸사용해서 php로 된 예제만 있는거지 ?
전 p12 파일로 보내는걸 만들었었단 말이죠. 에헴... p12 로 하면 문제되는게 있나...?
혹시 아시는분은 댓글좀..
암튼 .. 푸시인증(.p12)만들기부터 ~ 프로바이더 예제소스 제공해봅니당.
전.. 사진보단 텍스트를 좋아하기에 하하하하하핳하하하하하하 글만 쭉 ~~~ ㄱ
// 푸시 인증서 (apns.p12 만들기 ) ======================================================================================
1. CSR 만들기
- 용도 : APNS 활성화
- 방법
: "키체인" 실행
: 키체인 접근
: 인증 기관에서 인증서 요청
: 이메일주소 입력, 디스크에저장됨 선택 -> 다음
: CertificateSigningRequest.certSigningRequest 가 만들어진다.
2. APNS 활성화
- Apple 개발자 사이트로 이동
- Certificates, Identifiers & Profiles 메뉴 선택
- Identifiers 메뉴 선택
- App IDs 메뉴 선택
- 푸시서비스 하려는 앱에 해당하는녀석을 선택해서 Edit 클릭
- 하단에 Push Notifications 에 체크, Production SSL Certificate 생성(위에서 만든 CSR파일을 사용하게된다.)
- 만들어진 푸시 인증서를 다운받아서 더블클릭하여 키체인에 등록
3. 앱 인증서 재발급
- 푸시 인증서를 새로 받았으므로, 앱 인증서도 새로 할당받아야한다.
- 기존인증서 Revoke
- 추가버튼 클릭 후 생성
- 생성한 인증서를 다운받아서 실행 -> 키체인에 등록
4. 프로비저닝 프로파일 Active 상태로 만들기
- 인증서가 재발급 되었으므로 invaled 상태일것이다.
- 선택 후 Edit 클릭하여 조금전 새로만든 인증서를 할당
- 생성한 프로비저닝 프로파일을 다운받아서 더블클릭 -> xCode에 알아서 적용됨
5. 키체인에서 p12파일 만들기
- 용도 : Push Provider 에서 사용할 애플 푸시 인증서
- 키체인을 열고 인증서 목록에 보면 Apple Production IOS Push Services:com.emoney.smart 가 있다.
- 맥 PC의 개인키가 하위에 나타나야하며 저 제목과 개인키 두개를 선택해서 마우스 오른쪽 버튼을 클릭
- "2개 항목 보내기" 클릭
- 자동으로 .p12파일로 저장할 수 있다. (p12파일로 저장할수없다면 뭔가 잘못된것이다.)
6. 만들어진 p12파일을 provider쪽에서 사용 ~ 끝!
// 프로바이더 예제 소스 ~ ======================================================================================
import javapns.communication.ConnectionToAppleServer;
import javapns.communication.exceptions.CommunicationException;
import javapns.communication.exceptions.KeystoreException;
import javapns.devices.Device;
import javapns.devices.implementations.basic.BasicDevice;
import javapns.notification.AppleNotificationServerBasicImpl;
import javapns.notification.PushNotificationManager;
import javapns.notification.PushNotificationPayload;
import javapns.notification.PushedNotification;
import javapns.notification.Payload;
private String CERTIFICATE_PATH = "/~~/~~~.p12";
private String CERTIFICATE_PWD = "***"; // 푸시 인증서 비밀번호
private String APNS_DEV_HOST = "gateway.sandbox.push.apple.com"; // 개발용 푸시 전송서버
private String APNS_HOST = "gateway.push.apple.com"; // 운영 푸시 전송서버
private int APNS_PORT = 2195; // 이건..개발용 운영용 나뉘는지 확인해보자
private int BADGE = 1; // App 아이콘 우측상단에 표시할 숫자
private String SOUND = "default"; // 푸시 알림음
private int sendPush_IOS(ArrayList<String> tokens, HashMap<String, Object> map_pushInfo){
// 아이폰 푸시전송 - 최대 한글전송길이 45글자 (보낸이 + 내용)
int result = 0;
// 1. 푸시 기본정보 초기화
String sender_nick = (String)map_pushInfo.get("sender_nick");
String msg = (String)map_pushInfo.get("msg");
// 2. 싱글캐스트 or 멀티캐스트 구분
boolean single_push = true;
if(tokens.size()==1){
single_push = true;
}else{
single_push = false;
}
try{
// 3. 푸시 데이터 생성
PushNotificationPayload payLoad = new PushNotificationPayload();
JSONObject jo_body = new JSONObject();
JSONObject jo_aps = new JSONObject();
JSONArray ja = new JSONArray();
jo_aps.put("alert",msg);
jo_aps.put("badge",BADGE);
jo_aps.put("sound",SOUND);
jo_aps.put("content-available",1);
jo_body.put("aps",jo_aps);
jo_body.put("sender_nick",sender_nick);
payLoad = payLoad.fromJSON(jo_body.toString());
PushNotificationManager pushManager = new PushNotificationManager();
pushManager.initializeConnection(
new AppleNotificationServerBasicImpl(CERTIFICATE_PATH, CERTIFICATE_PWD,ConnectionToAppleServer.KEYSTORE_TYPE_PKCS12, APNS_HOST, APNS_PORT));
List<PushedNotification> notifications = new ArrayList<PushedNotification>();
if (single_push){
// 싱글캐스트 푸시 전송
Device device = new BasicDevice();
device.setToken(tokens.get(0));
PushedNotification notification = pushManager.sendNotification(device, payLoad);
notifications.add(notification);
}else{
// 멀티캐스트 푸시 전송
List<Device> device = new ArrayList<Device>();
for (String token : tokens){
device.add(new BasicDevice(token));
}
notifications = pushManager.sendNotifications(payLoad, device);
}
List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
int failed = failedNotifications.size();
int successful = successfulNotifications.size();
if(failed > 0){
result = 2; // 푸시 실패건 발생
}else{
result = 1; // 푸시 모두 성공
}
}catch(KeystoreException ke){
result = 9;
}catch(CommunicationException ce){
result = 9;
}catch (Exception e) {
result = 9;
e.printStackTrace();
}
return result;
}
댓글
댓글 쓰기