일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 기획
- 플러그인
- 토이프로젝트
- Firebase
- nginx
- react-query
- plugin
- react
- database
- 프론트
- 신상마켓
- 회고록
- login
- jwt
- 셋팅
- 로그인
- vue login
- Docker
- 정리
- vuex
- 뷰
- express
- extension
- 배포
- Git
- vue
- javascript
- AWS
- PWA
- vsCode
- Today
- Total
강디너의 개발 일지
Vue PWA - Firebase Cloude Messaging 설정(web push) 본문
목적
- Vue.js를 사용하면서 web push를 사용하고 싶다.
- Firebase를 사용해서 web push 시스템을 만들고 싶다.
- 다음 사이드 프로젝트에서 사용할 것이다.
- 모바일팀에서 firebase를 이용해 푸시 시스템을 쓰고 있는데, '언젠가... 웹에도 적용할 수도 있을 것 같다'라는 말을 듣고... 연습 삼아...
Firebase setting
필요 모듈 (npm install -g)
- firebase-tools
window 경우에는 cmd를 권한 있는 창으로 키셔야 합니다.
프로젝트 root에 firebase를 초기화해줍니다.
자세한 설치는 여기서 설명
Firebase console
프로젝트 설정에서 firebase cloude messaging 설정을 찾을 수 있습니다.
firebase cloude messaging
여기서 중요한 것은 서버 키를 잘 기억해야 하는데, 나중에 푸시 보낼 때 헤더에 넣어야 하기 때문입니다.
그리고 아래에 키 쌍 생성 버튼을 눌러줍니다.
위와 같은 키 쌍이 생기는데, 이 키는 추후 프론트 코드에 들어가야 합니다.
키 쌍: 추후 들어갈 firebase cloude messaging ID 키 값
"테스트용으로 만든 프로젝트라 키값을 공개하는 것입니다"
Vue 프로젝트
필요 모듈
- firebase
- @firebase/messaging
디렉터리 구조
firebase cloude message를 사용하려면 firebase service worker 가 필요합니다.
vue pwa 세팅을 하면, 기본적으로 registerServiceWorker가 src/ 에 있습니다.
하지만 firebase-messaging-sw.js 파일은 직접 만들어서 public 폴더 아래에 넣어주시면 됩니다.
firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/7.15.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/7.15.0/firebase-messaging.js');
const config = {
apiKey: '--------------',
authDomain: '---------',
databaseURL: '-------------',
projectId: '------------',
storageBucket: '----------',
messagingSenderId: '------------',
appId: '------------',
measurementId: '------------',
};
firebase.initializeApp(config);
const messaging = firebase.messaging();
// 백그라운드 상태에서 받은 알림 처리
messaging.setBackgroundMessageHandler((payload) => {
console.log('Message received. ', payload);
// Customize notification here
const title = 'Background Message Title'
const options = {
body: payload.data.message,
icon: '/firebase-logo.png'
}
return self.registration.showNotification(title, options);
});
public에 들어가는 jsavascript라서 firebase 세팅을 별도로 해줘야 합니다.
services/messaging/messaging.ts
import { ref } from '@vue/composition-api';
import firebase from 'firebase/app';
import '@firebase/messaging';
import config from '../../../firebaseConfig';
firebase.initializeApp(config);
const token = ref<string>('');
const messaging = firebase.messaging();
messaging.usePublicVapidKey(/* 키 쌍 쪽에서 만든 firebase cloude messaging ID 키 값 */);
messaging.getToken().then((currentToken) => {
if (currentToken) {
console.log(currentToken);
token.value = currentToken;
} else {
// Show permission request.
console.log('No Instance ID token available. Request permission to generate one.');
}
});
messaging.onMessage((payload) => {
console.log(payload);
const title = 'Title';
const options = {
body: payload.data.message,
icon: '/firebase-logo.png',
};
const notification = new Notification(title, options);
return notification;
});
export {
token,
messaging,
};
위에서 만든 키 값을 넣어줍니다.
App.vue
<template>
<div class="home">
토큰: {{ token }}
</div>
</template>
<script>
import { token } from '@/services/messaging/messaging';
export default {
name: 'Home',
setup() {
return {
token,
};
},
};
</script>
토큰 값이 잘 나오는 것을 확인할 수 있습니다.
이 토큰으로 해당 브라우저에 푸시를 날릴 수 있습니다.
key='위에서 설명한 서버 키'입니다.
POST // https://fcm.googleapis.com/fcm/send
{ "to": "여기에는 방금 받은 토큰 값", "data": {"message": "Hello"}}
모바일에서도 해당 토큰으로 쏘면 푸시가 가는 것을 볼 수 있습니다.
어려웠던 점
firebase에서 firebase-messaging-sw.js를 서비스 워커에 등록하라는데...
이미 vue-pwa에서 만들어진 서비스 워커가 있는데 겹쳐도 상관없는지를 모르겠고...
모바일에서는 캐시가 엄청 귀찮게 안 지워지고... ㅠ
정보가 생각보다 많이 없어서 리서치가 힘들었습니다.
참고
질문받습니다!
'Javascript > Vue.js' 카테고리의 다른 글
javascript - firebase, google 로그인 with Vue.js (2) | 2020.11.05 |
---|---|
javascript - 카카오 로그인 with Vue.js (20) | 2020.10.23 |
Vue - 특정 페이지 비밀번호 걸기 (0) | 2020.06.02 |
Vue 관련 잘 몰랐던 개념 정리 (0) | 2020.04.16 |
Vue - 동적 컴포넌트를 이용한 Layout 설정 (5) | 2020.03.24 |