5월, 2023의 게시물 표시

node 에서 apns 푸시 메시지를 Slient 로 보내는 방법

노드에서 아이폰으로 사일런트 푸시를 보낼 때 방법이다. 나 같은 경우는 수면 알람을 깨우는데 사용한다. 버전은 apn 2.2.0 을 사용했다. 이 버전이 노드 16 이상을 요구해서 노드를 업그레이드 했다. 먼저 선언을 한다. const apn = require ( ' apn ' ); 그런 다음 보내기 위한 옵션을 설정한다. var options = { token : { key : " ./AuthKey_XXXX.p8 " , keyId : " XXXX " , teamId : " XXXX " }, production : false }; var apnProvider = new apn. Provider (options); 수면 알람이 분단위로 측정되기 때문에 매분마다 수행하는 루틴을 작성 후  그 안에 로직을 추가하였다. setInterval ( async function () { let notification = new apn. Notification (); notification.topic = " 앱 번들 아이디 " notification.priority = 5 notification.pushType = " Background " notification.rawPayload = { aps : { " content-available " : 1 }, acme1 : " bar " , acme2 : 42 } apnProvider. send (notification, i.token). then (( result ) => { console . log ( JSON . stringify (

Flutter 에서 수면 알람 기능 제작

 기존에 만들어 놓은 앱이 있다. 안드로이드 코틀린으로 아이폰 스위프트로 작성하였다. 이를 수정하기로 하였다. Flutter 로 작성해서 개발 공수를 줄이자고 결정했다. 다른 화면은 모두 순조롭게 구현이 되었지만 알람 기능이 문제였다. flutter package 에 alarm 이 있다. 이를 적용하고자 했으나 추가하면 오류가 났다. 깃헙에 이슈에 등록해도 클린 후 다시 적용만 하라고 했는데 개발자 중에 그걸 안하고 이슈에 올릴 사람은 적을 것이다. 이후 답변이 없고 마냥 기다릴 수 없어서 다른 패키지를 검색했다. flutter_local_notification 패키지를 이용하는 것이다. 안드로이드를 대상으로 하니 잘 된다. 문제는 아이폰에서 음원 반복이 되지 않았다. 아침에 깨워주는 기능인데 30초 음원으로 만들어서 등록해도 30초만 플레이 되는 문제가 발생되었다. 이를 해결하고자 아이폰 알람은 직접 제작하기로 했다. 메소드 채널이란 기능을 이용하면 플러터에서 스위프트 함수를 호출할 수 있다. 스위프트로 로컬 노티피케이션 기능을 활용하여 알람을 구현하였다. 앱이 켜져 있는 상태인 Foreground 에서 알람 기능은 잘 작동하였다. 하지만 꺼져 있는 상태인 Background 에서는 잘 작동하지 않았다. 아침에 알람이 30초 동안만 울린다. 음원 반복재생이 되지 않았다. 백그라운드 패치를 이용해서 매분마다 체크를 구현하다가 너무 이건 아닌가 싶어 포기했다. 푸시 기능을 활용하면 didReceiveRemoteNotification 에서 이벤트를 잡을 수 있다. 나머지 이벤트는 알람창을 터치하면 뜨는 이벤트이다. 고로 알람 시간을 추가하면 서버에 토큰과 시간을 등록하고 그 시간이 되면 서버에서 Slient Push Message 를 보낸다. 앱은 알람을 즉시 작성해서 창을 띄우고 음원을 반복재생한다. 이런 구성으로 구현하니 잘 작동된다.