Fast and Service Worker를 사용하여 밀어넣기 알림 보내기

입문


PC의 브라우저에 slack 같은 푸시 알림을 보내고 싶은 상황에서 SSR 구조라면 응용 서버, 클라이언트, 푸시 서버만 있으면 가능하다.
푸시 서버는 각 클라이언트 브라우저를 위해 준비할 수 있는지, Chrome Firefox Edge 등을 지원합니다.
추식 알림을 보내기 전의 절차는...
  • 클라이언트가 추식 알림을 받을 수 있을 때 응용 서버에 필요한 정보를 보냅니다.
  • 애플리케이션 서버에 이 정보를 저장합니다.
  • 푸시 알림을 보낼 때 보관 정보에 따라 푸시 서버에 요청을 보냅니다.
  • 브라우저는 푸시 서버에서 푸시 알림을 받습니다.
  • 형식.
    현재 업무 중에 채팅 시스템을 개발하여 특정 사용자에게 구성원을 보낼 때 해당 사용자의 장치에 추식 알림을 보내는 시스템을 개발하였기 때문에 그 절차를 소개한다.
    나는 slack의 화장수를 만들고 싶다.

    프로비저닝


    서버
  • Express
  • SocketIO
  • Node.js 환경에서 웹소켓을 연결하는 라이브러리
  • web-push
  • 서버에서 클라이언트 응용 프로그램에 푸시 알림을 재생하는 NPM 패키지
  • DB
  • MongoDB (CosmosDB)
  • 클라이언트
  • Vue.js
  • SocketIO-client
  • SocketIO에 연결하는 클라이언트 라이브러리
  • SocketIO와 SocketIO-client가 통일된 버전 관리를 하지 않으면 움직이지 않는다
  • Axios
  • Axios에서 HTTP 요청
  • 서비스 종사자 등록


    시스템을 로그인제로 설정해 보세요. 채팅에서 다른 사용자에게 구성원을 던질 수 있습니다.
    이 때, 나는 서비스Worker의 기능을 이용하여 로그인한 사용자의 단말기에 추식 알림을 보내려고 한다.
    Vue에서 PWA를 가져오는 절차는 Nuxt로 개발할 것인지 vue-cli로 개발할 것인지에 따라 다릅니다.이번에는 vue-cli를 이용했기 때문에 그쪽 방법을 소개해 드릴게요.
    vue add @vue/pwa
    
    의 명세란 스타일에 정의된 설정입니다.
    registerServiceWorker.js가 있지만 브라우저에 서비스워커를 등록한javascript 파일입니다.
    registerServiceWorker.js
    import { register } from 'register-service-worker'
    
    if (process.env.NODE_ENV === 'production') {
      register(`${process.env.BASE_URL}service-worker.js`, {
        ready () {
          console.log(
            'App is being served from cache by a service worker.\n' +
            'For more details, visit https://goo.gl/AFskqB'
          )
        },
        registered () {
          console.log('Service worker has been registered.')
        },
        cached () {
          console.log('Content has been cached for offline use.')
        },
        updatefound () {
          console.log('New content is downloading.')
        },
        updated () {
          console.log('New content is available; please refresh.')
        },
        offline () {
          console.log('No internet connection found. App is running in offline mode.')
        },
        error (error) {
          console.error('Error during service worker registration:', error)
        }
      })
    }
    
    등록할 때의 상태에 따라 각 기능을 호출합니다.잘못했을 때 하고 싶은 일은 여기서 컨트롤할 수 있다.
    또한 vue는 개발 모드에서 서비스워커를 실행하는 것을 추천하지 않기 때문에 실제 등록도 생산에서 진행해야 한다.
    ServiceWorker가 성공적으로 등록되었는지 여부는 개발자 도구의 응용 프로그램 탭을 보고 Source에서 파일을 등록하면 됩니다. 푸시 알림 권한 부여 구현 웹에서 자주 볼 수 있는 밀어넣기 알림을 허용하는 단추를 설치합니다.허용하면 각 브라우저에 대해 설정된 푸시 서버에서 끝점으로 사용할 URL과 키를 보냅니다.서버는 밀어내기 알림을 보낼 때 키와 함께 밀어내기 알림으로 표시된 내용을 이 끝에 보낼 수 있습니다. https://developer.mozilla.org/ja/docs/Web/API/PushManager/getSubscription PushManager.getSubscription().then(subscription => {})subscriptionnull의 경우 이 사용자는 추식 통지를 허가하지 않으며, 추식 통지를 허가하는 경우subscription에 상기 정보를 저장한다.이러한 정보는 추식 알림을 허용하는 사용자에게 추식 알림을 보내기 위해 응용 서버에 저장되어야 합니다.
    registerServiceWorker.js
     swRegistration.pushManager.getSubscription()
       .then(function(subscription) {
       // 通知が購読されたかどうか
         isSubscribed = !(subscription === null);
     // もし購読されていれば、アプリケーションサーバーへ購読者情報の登録
     if (isSubscribed) updateSubscriptionOnServer(subscription);
       });
    

    구현 서비스 워커


    ServiceWorker에서 각 이벤트는 코드를 작성해야 합니다.
    sw.js
     // push通知を受け取ったときの挙動
     self.addEventListener("push", function(event) {
       const data = JSON.parse(event.data.text());
       const title = data.title;
       // push通知のbody アイコンの情報を詰める。
       const options = {
         body: data.message, // 表示メッセージ
         icon: "../thumbnail/pwa/android-chrome-192x192.png", // アイコン
         badge: "../thumbnail/pwa/android-chrome-192x192.png", // バッチアイコン
       };
       event.waitUntil(self.registration.showNotification(title, options));
     });
    
    또한 서비스워커에 추식 알림을 눌렀을 때의 동작을 기록할 수 있고 응용 서버 → 추식 이벤트 → 클릭 이벤트 및 내용을 지정할 수 있다.

    응용 서버에서 푸시 알림 자격 증명 수신


    ServiceWorker에서 게시하는 밀어내기 알림에 필요한 정보는 다음과 같습니다.
     {
     "endpoint":"endpointURL",
     "p256dh":"...",
     "auth":"..."
     }
    
  • endpoint-Push 알림을 보내는 푸시 서버 URL
  • p256dh- 브라우저에서 발행된 공개 키
  • auth- 사용자 에이전트와 서버 측이 공유하는 공유 키 생성을 방지하는 랜덤 수
  • 개발된 시스템은 로그인 시스템이기 때문에 이 정보들을 사용자 정보와 연결시켜 보관한다.사용자가 여러 브라우저에서 시스템을 처리할 수 있기 때문에 사용자와 인증 정보는 1: 여러 관계입니다.

    WebPush를 사용하여 Push 알림 보내기


    응용 서버에서 밀어넣기 알림을 보낼 때 Node.js 환경에서 사용web-push.
  • 서버 측에서도 공공 키와 개인 키를 미리 생성하는 그룹을 웹-pushsetVapidDetails로 설정합니다.
  • 에 이어 클라이언트로부터 받은 auth, p256dh의 키, endpoint의 URL을 설정하면 밀어넣기 알림을 실행할 수 있습니다.
  • server.js
    const webpush = require('web-push');
     // サーバー側の鍵情報を詰める
    webpush.setVapidDetails(
      'mailto:[email protected]',
      vapidKeys.publicKey,
      vapidKeys.privateKey 
    );
    
     // Push通知を送るクライアント側の情報を詰める
    const pushSubscription = {
      endpoint: '.....',
      keys: {
        auth: '.....',
        p256dh: '.....'
      }
    };
    // Push通知を送る
    webpush.sendNotification(pushSubscription, 'Your Push Payload Text');
    
    푸시 알림은 일반적인 HTTP 요청과 마찬가지로 endpoint의 URL에서 HTTP 상태 코드로 푸시 알림의 실행 결과를 수신하기 때문에 오류 처리 등은 각 단점의 규격을 확인하면 된다.
    화가 나는 것은 이 부근의 규격이 단점과 전혀 다른 구역이니 일일이 확인해야 한다는 것이다.

    사용자가 푸시 알림 라이센스를 취소할 때의 HTTP 상태 코드

  • chrome - 403
  • firefox - 410
  • 결국


    이후 채팅의 통신에서 WebPush를 보내는 함수를 호출하면 채팅과 Push 알림 기능이 연결됩니다.구성원의 사용자가 밀어넣기 알림을 허용하면 브라우저에서 알림이 표시됩니다.
    사실 세계 최고의 브라우저 Vivaldi에서 받은 구성원의 스냅샷
    (개발 중인 시스템 이름과 아이콘이 보여서 수정했습니다) 참고 자료 웹 응용 프로그램에 푸시 알림 추가
    추식 알림에 관한 클라이언트의 설정과 쓰기 방법을 크게 참고하였다.
    @vue/cli-plugin-pwa
    vue-cli에서 PWA 환경 구성에 필요한 모듈
    web-push
    Node.js 환경에서 밀어내기 알림을 보내는 NPM 패키지

    좋은 웹페이지 즐겨찾기