본문 바로가기
프로그래밍_

Node.js APNs 서버 개발

by Mocca_ 2023. 1. 30.

Java에 이어서 Node.js를 통해 푸시 테스트를 해보았습니다. Java보다는 간단했습니다. p12 인증서 방식의 암호화된 pem파일을 사용했습니다. 오늘 배웠던 모듈과 소스에 대해서 정리해보겠습니다. 

 

 

 

 

1. Node.js에서 apn 모듈 이용하기

apn 모듈

node.js에서 모듈을 사용하지 않으면 제 기능을 못쓰고 있는 것입니다. 'apn' 모듈을 통해서 ios 기기에 푸시메시지를 보내보겠습니다. apn 모듈은 이번 주에만 63855명이 다운받아 푸시메시지를 주고받는데 사용하고 있습니다. 

 

설치하는 법은 단순하게 

npm install apn --save 입니다.

 

준비물은 앞 포스팅에서 많이 말했던 pem 파일입니다. 인증서를 받는 방법과 pem 파일을 받는 방법, 인증서에 대한 개념은 앞선 포스팅에 많이 설명했으니 거쳐오셔요. 이번 포스팅은 다른 프로그램을 이용하지 않고 Node.js를 통해서 Push를 테스트해보는 것입니다. 

 

2023.01.28 - [취미로 코딩하기] - IOS 개발 APNs 아이폰 테스트

2023.01.25 - [취미로 코딩하기] - iOS Push Notification 개발 및 테스트, 사용법

 

apn 모듈을 통해 우리는 ios 앱에 푸시를 기본적으로 보낼 수 있고 badge, alert, expiry, sound 등의 상세한 설정을 할 수 있습니다. 

 

{"messageFrom":"John Appelseed","aps":{"badge":3,"sound":"ping.aiff","alert":"\uD83D\uDCE7 \u2709 You have a new message"}}

 

메시지는 JWT (Json WebToken)으로 이루어져있는데 위는 Push Message를 보내기 위한 Json의 예시입니다. 

 

apn 에서 좋았다고 생각하는 것은 Trouble Shooting( 에러가 무엇인지 알고 처리하는 것)을 편하게 할 수 있다는 것입니다. 

 

https://developer.apple.com/library/archive/technotes/tn2265/_index.html

 

Technical Note TN2265: Troubleshooting Push Notifications

Technical Note TN2265 Troubleshooting Push Notifications Describes techniques you can use to resolve issues with sending and receiving push (remote) notifications in iOS and OS X. Issues with Receiving Push Notifications Issues with Sending Push Notificati

developer.apple.com

 

처음 인증서를 생성하는 방법부터 처리과정까지 제대로 나와있습니다. 

제가 이번에 겪었던 착오는 인증서는 Development용, production용이 있는데 Xcode를 통해 바로 실기기에 넣었는데 멍청하게 production용으로 푸시테스트를 했습니다. 그래서 BadDeviceToken이라는 에러를 보고 Development로 수정하니 가능해졌습니다. 

 

Development용 인증서 - Xcode에서 디버깅한 모든 앱에 적용

Production용 인증서 - AppStore에서 다운받은 모든 앱에 적용

 

반응형

 

 

2. Node.js를 통해서 Push서버 개발

 

npm install apn 을 통해서 모듈을 설치하셨다면 이제 코드를 적어보겠습니다. 

var apn = require('apn')
var pro_option = {
    cert: 'aps_production.pem 의 경로를 적어준다.',
    key:'mykey.pem의 경로를 적어준다.',
    production: false, 
    passphrase:"pem에 사용했던 암호를 적어준다."
}
const service = new apn.Provider(pro_option)
const note = new apn.Notification()
note.topic = "Xcode나 개발자계정에서 보고 bundle identifier를 적어준다. ex)com.korea.moka"
note.alert = "Hello! Its test"

 service.send(note, '푸시를 받고 싶은 기기의 디바이스토큰을 적어준다.').then( result => {
        console.log("sent : ", result.sent.length)
        console.log("failed : ", result.failed.length)
        console.log(result.failed)
    })

pro_option에서 인증서에 대한 정보, 키에 대한 정보를 적어주고 암호까지 적어서 Json형식으로 만들어줍니다. 

이것을 Provider객체 인자로 받아서 service를 만들어줍니다.

note 변수의 경우에는 푸시를 어떤 방식으로 보낼 것인지 방식을 설정합니다.

 

마지막으로 send 메소드를 통해서 비동기로 처리하고 처리한 결과를 result 값으로 받아서 확인합니다.

result로 결과를 받아서 확인하는 것은 매우 중요합니다. APNs의 경우 어디서 디버깅을 해야할지 참 애매합니다. 제대로 된 바이블이 없어서이기도 합니다. 

 

실패한다면 result.failed 값에서 구글링해보시길 바랍니다. 저는 BadDeviceToken 에러가 나와서 구글링을 통해서 바로 고쳤습니다.

 

이 코드를 터미널에서 node 명령어를 통해 실행시켜줍니다. 

 


[함께 읽으면 좋은 글]

 

2023.01.25 - [취미로 코딩하기] - iOS Push Notification 개발 및 테스트, 사용법

 

iOS Push Notification 개발 및 테스트, 사용법

iOS에서 Push Notification을 개발하거나 테스트하려면 개발자계정이 있어야 합니다. 요즘 push기능이 없는 앱은 거의 없습니다. 개발자계정에 어떤 종류가 있는지도 다룰 테지만 먼저 정리해야 할 것

commnetall.tistory.com

2023.01.25 - [취미로 코딩하기] - Docker, 도커를 사용하는 이유와 도커 설치법

 

Docker, 도커를 사용하는 이유와 도커 설치법

도커를 사용하면 서버환경 구성하기 편하다는 말을 조금씩 들어왔지만 제대로 공부하고 설치해본 적은 없었습니다. 그래서 이번에는 도커를 활용해 AZURE나 AWS서버를 구축하는 과정을 해보려했

commnetall.tistory.com

 

2023.01.26 - [취미로 코딩하기] - 자바스크립트 ES6 , CommonJS 문법, 모듈시스템 차이

 

자바스크립트 ES6 , CommonJS 문법, 모듈시스템 차이

nodejs의 장점은 모듈시스템입니다. 모듈시스템을 구성하는 방법은 node에서는 단순하게 ES6식, CommonJS식 모듈시스템 2개가 있습니다. 오늘은 ES6, CommonJS 뭐가 다른지 어떨 때 무엇을 쓰는게 현명한

commnetall.tistory.com

 


 

 

 

댓글