From 880062e13634012c887e76beda035a83da501361 Mon Sep 17 00:00:00 2001 From: "seonkyu.kim" Date: Tue, 20 Aug 2024 14:29:30 +0900 Subject: [PATCH] =?UTF-8?q?[=E2=9C=A8]=20APNs=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/app.js | 9 ++---- apps/push.js | 78 ++++++++++++++++++++++++++++------------------------ 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/apps/app.js b/apps/app.js index b4b077f..8a3821a 100644 --- a/apps/app.js +++ b/apps/app.js @@ -2,15 +2,12 @@ import express, { query } from 'express'; import { createDatabaseConnection } from '../db/database.js'; // db 연결 파일 import { dbConfig } from '../private/config.js'; -// import { HandlePush } from './push.js'; -// const cmcd = "/JJ"; -// const db = "/JJ/db"; -// const app = express(); -// app.use(express.json()); - +import { HandlePush } from './push.js'; const router = express.Router(); +router.post('/push', HandlePush); + router.get('/version', async (req, res) => { try { const connection = await createDatabaseConnection(dbConfig); diff --git a/apps/push.js b/apps/push.js index 4d35511..9695514 100644 --- a/apps/push.js +++ b/apps/push.js @@ -1,45 +1,51 @@ -import { admin } from '../firebaseConfig.js'; +import apn from 'apn'; +import { bundleID, apnKey, apnKeyID, apnTeamID } from '../private/config.js'; + +// APNs 옵션 설정 +const options = { + token: { + key: `../private/${apnKey}`, // 다운로드한 .p8 파일 경로 + keyId: apnKeyID, // Apple Developer Console에서 얻은 키 ID + teamId: apnTeamID, // Apple Developer Console에서 얻은 팀 ID + }, + production: false, // 프로덕션(실제 배포 환경)인 경우 true로 설정 +}; + +const apnProvider = new apn.Provider(options); export function HandlePush(req, res) { - const { fcmToken, title, body, parameter, sound, badge } = req.body; + const { deviceToken, title, body, parameter, sound, badge } = req.body; - if (!fcmToken || !title || !body) { - res.status(400).json({ error: 'fcmToken, title, body, and parameter are required' }); + if (!deviceToken || !title || !body) { + res.status(400).json({ error: 'deviceToken, title, and body are required' }); return; } - const message = { - token: fcmToken, - notification: { - title: title, - body: body, - }, - apns: { - payload: { - aps: { - alert: { - title: title, - body: body, - parameter: parameter, - }, - sound: sound || 'default', - badge: badge ? Number(badge) : 0, - }, - }, - }, + // APNs Notification 설정 + const notification = new apn.Notification(); + notification.topic = bundleID; // 애플리케이션 번들 ID + notification.expiry = Math.floor(Date.now() / 1000) + 3600; // 1시간 후 만료 + notification.badge = badge ? Number(badge) : 0; + notification.sound = sound || "default"; + notification.alert = { + title: title, + body: body, }; + notification.payload = { parameter: parameter }; - - // const jjApp = admin.app('jjungtable'); - - admin.app('jjungtable').messaging().send(message) - .then((response) => { - console.log('Successfully sent message:', response); + // APNs를 통해 푸시 알림 전송 + apnProvider.send(notification, deviceToken).then((response) => { + if (response.sent.length > 0) { + console.log('Successfully sent message:', response.sent); res.status(200).json({ message: 'Successfully sent message' }); - }) - .catch((error) => { - console.error('Error sending message:', error); - res.status(500).json({ error: `Error sending message: ${error.message}` }); - }); -} - + } else { + console.error('Failed to send message:', response.failed); + res.status(500).json({ error: 'Failed to send message', details: response.failed }); + } + }).catch((error) => { + console.error('Error sending message:', error); + res.status(500).json({ error: `Error sending message: ${error.message}` }); + }).finally(() => { + apnProvider.shutdown(); // APNs 연결 종료 + }); +} \ No newline at end of file