54 lines
2.0 KiB
JavaScript
54 lines
2.0 KiB
JavaScript
import apn from 'apn';
|
|
import path from 'path'; // path 모듈을 가져옵니다.
|
|
import { fileURLToPath } from 'url'; // ES 모듈에서 파일 경로를 얻기 위해 필요
|
|
import { bundleID, apnKey, apnKeyID, apnTeamID } from '../private/config.js';
|
|
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
// APNs 옵션 설정
|
|
const options = {
|
|
token: {
|
|
// key: `../private/${apnKey}`, // 다운로드한 .p8 파일 경로
|
|
key: path.join(__dirname, '../private', apnKey), // 절대 경로로 변경
|
|
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 { id: deviceToken, title, body, parameter, sound = "default", badge = 0 } = req.query;
|
|
|
|
if (!deviceToken || !title || !body) {
|
|
res.status(400).json({ error: 'deviceToken, title, and body are required' });
|
|
return;
|
|
}
|
|
|
|
const notification = new apn.Notification();
|
|
notification.topic = bundleID;
|
|
notification.expiry = Math.floor(Date.now() / 1000) + 3600;
|
|
notification.badge = Number(badge);
|
|
notification.sound = sound;
|
|
notification.alert = { title, body };
|
|
notification.payload = { parameter };
|
|
|
|
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' });
|
|
} 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();
|
|
});
|
|
} |