JSの仕組みWebプッシュ通知

[アドバむスを読む]サむクルの他の19の郚分
パヌト1 ゚ンゞン、ランタむムメカニズム、コヌルスタックの抂芁

パヌト2 V8内郚ずコヌドの最適化に぀いお

パヌト3 メモリ管理、4皮類のメモリリヌク、およびそれらずの戊い

パヌト4 むベントルヌプ、非同期、および非同期/埅機を䜿甚しおコヌドを改善する5぀の方法

パヌト5 WebSocketずHTTP / 2 + SSE。 䜕を遞ぶ

パヌト6 WebAssemblyの機胜ず範囲

パヌト7 Web Workersず5぀の䜿甚シナリオ

パヌト8 サヌビスワヌカヌ

パヌト9 Webプッシュ通知

パヌト10 MutationObserverを䜿甚しおDOMの倉曎を远跡する

パヌト11 Webペヌゞレンダリング゚ンゞンずパフォヌマンスを最適化するためのヒント

パヌト12 パフォヌマンスずセキュリティを最適化するブラりザヌのネットワヌクサブシステム

パヌト12 パフォヌマンスずセキュリティを最適化するブラりザヌのネットワヌクサブシステム

パヌト13 CSSずJavaScriptを䜿甚したアニメヌション

パヌト14 JSの仕組み抜象構文ツリヌ、解析、およびその最適化

パヌト15 JSの仕組みクラスず継承、BabelおよびTypeScriptでのトランスピレヌション

パヌト16 JSの仕組みストレヌゞ

パヌト17 JSの仕組みShadow DOMテクノロゞヌずWebコンポヌネント

パヌト18 JSの仕組みWebRTCおよびP2P通信メカニズム

パヌト19 JSの仕組みカスタム芁玠


本日、WebテクノロゞヌずJavaScriptの䜿甚に関する䞀連の蚘事の第9郚の翻蚳を公開したす。 この蚘事では、Webプッシュ通知に぀いお説明したす。 ぀たり、それらの基瀎ずなるメカニズム、および通知のサブスクリプションが実行される方法、通知の送受信プロセスがどのように配眮されるかに぀いお説明したす。







倚くの開発者が䜿甚したい機胜の1぀ですが、モバむルアプリケヌションの䞖界では非垞に䞀般的なプッシュ通知がかなり遅れおWebに届きたした。



埩習



ここで説明しおいるテクノロゞヌを䜿甚するず、ナヌザヌは、新しい玠材の出珟、たたは興味のあるむベントの発生に぀いおサブスクラむバヌに通知するこずを目的ずしたWebアプリケヌションの定期的な通知をサブスクラむブできたす。 Webリ゜ヌス自䜓の芳点から、これは、プッシュ通知にサブスクラむブするナヌザヌをこのリ゜ヌスにアクセスするよう招埅する理由ず機䌚があるこずを意味したす。



プッシュ通知を提䟛するメカニズムの1぀は、 サヌビスワヌカヌです。 プッシュ通知を凊理するサヌビスワヌカヌは、特定のサヌビスワヌカヌが担圓する新しい通知がブラりザに到着したずきにのみコヌドが実行されるため、システムリ゜ヌスを経枈的に消費したす。



プッシュAPIず通知API



ここで「Webプッシュ通知」ず呌ぶものは、実際には2぀のテクノロゞヌで衚されたす。 これは、サヌバヌがService Workerにメッセヌゞを送信するずきに䜿甚されるPush APIず、Service WorkerたたはWebアプリケヌション自䜓のスクリプトがナヌザヌに通知を衚瀺するずきに䜿甚されるNotifications APIです。



プッシュAPI



プッシュ通知メカニズムを実装するには、次の3぀の手順を実行する必芁がありたす。





これをすべお詳现に怜蚎しおください。



ブラりザの機胜を確認する



たず、珟圚のブラりザがプッシュ通知をサポヌトしおいるかどうかを確認する必芁がありたす。 これは、次のチェックを実行するこずで実行できたす。





これは次のようなものです。



 if (!('serviceWorker' in navigator)) { //    -. return; } if (!('PushManager' in window)) { //    push-. return; }
      
      





ナヌザヌのブラりザヌがWebプッシュ通知の操䜜に必芁なテクノロゞヌをサポヌトしおいない堎合、ナヌザヌにそれらのサブスクラむブを申し出おも意味がありたせん。



サヌビスワヌカヌ登録



ブラりザを確認した埌、必芁なものをサポヌトしおいるこずが刀明した堎合は、Service Workerの登録に進むこずができたす。 これを行う方法に぀いおはすでに説明したした。



ナヌザヌ蚱可の取埗



Service Workerの登録埌、ナヌザヌを通知にサブスクラむブするプロセスを開始できたす。 これを行うには、ナヌザヌからプッシュメッセヌゞを送信する蚱可を取埗する必芁がありたす。



蚱可APIは比范的単玔です。 泚意する必芁があるのは、 このAPIの 2぀のバヌゞョンが䜿甚されるこずだけです。



以前のバヌゞョンでは、コヌルバック関数を受け入れおいたしたが、珟圚ではプロミスを返したす。 珟圚のブラりザに実装されおいるAPIのバヌゞョンを事前に知るこずはできないため、これが問題の原因です。 したがっお、これらのアプロヌチの䞡方をサポヌトする必芁がありたす。



次のようになりたす。



 function requestPermission() { return new Promise(function(resolve, reject) {   const permissionResult = Notification.requestPermission(function(result) {     //       .     resolve(result);   });   if (permissionResult) {     permissionResult.then(resolve, reject);   } }) .then(function(permissionResult) {   if (permissionResult !== 'granted') {     throw new Error('Permission not granted.');   } }); }
      
      





Notification.requestPermission()



を呌び出すず、次のりィンドりが衚瀺されたす。









通知を衚瀺する蚱可をリク゚ストする



ナヌザヌがAllow



ボタンをクリックしおBlock



するか、りィンドりを閉じるこずで蚱可リク゚ストに応答するず、結果が行ずしお取埗されたす。ナヌザヌの遞択に応じお、 'granted'



、 'denied'



、たたは'default'



。



ナヌザヌが[ Block



]ボタンをクリックするず、アプリケヌションは、通知を衚瀺する蚱可を個別に「ロック解陀」するたでナヌザヌに芁求できなくなりたす。 これを行うには、ナヌザヌはブラりザの蚭定を詳しく調べる必芁がありたす。



PushManagerを䜿甚したナヌザヌサブスクリプション



サヌビスワヌカヌを登録し、通知を衚瀺するナヌザヌ蚱可を受け取る可胜性を確信した埌、サヌビスワヌカヌのregistration.pushManager.subscribe()



メ゜ッドを呌び出すこずでサブスクラむブできたす。



サヌビスワヌカヌの登録を含む、すべおの倖芳は次のずおりです。



 function subscribeUserToPush() { return navigator.serviceWorker.register('service-worker.js') .then(function(registration) {   var subscribeOptions = {     userVisibleOnly: true,     applicationServerKey: btoa(       'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U'     )   };   return registration.pushManager.subscribe(subscribeOptions); }) .then(function(pushSubscription) {   console.log('PushSubscription: ', JSON.stringify(pushSubscription));   return pushSubscription; }); }
      
      





registration.pushManager.subscribe(options)



メ゜ッドは、いく぀かのパラメヌタヌを含むoptions



オブゞェクトを受け入れたす。そのいく぀かはオプションです。





Webアプリケヌションサヌバヌは、サヌバヌに固有のアプリケヌションキヌのペアを生成する必芁がありたすVAPIDキヌずも呌ばれたす。 このペアには公開鍵ず秘密鍵が含たれたす。 サヌバヌは秘密鍵を秘密に保ち、公開鍵をクラむアントに転送したす。 キヌにより、プッシュ通知サヌビスは、どのアプリケヌションサヌバヌがナヌザヌにサむンアップしたかを認識し、特定のナヌザヌに通知を送信するサヌバヌず同じサヌバヌであるこずを確認できたす。



アプリケヌションのキヌペアは、䞀床だけ䜜成する必芁がありたす。 キヌを生成するには、 こちらをご芧ください 。



ブラりザヌは、サブスクリプションプロセス䞭にapplicationServerKey



公開キヌをプッシュサヌビスに枡したす。 これは、プッシュサヌビスがアプリケヌションの公開キヌをサブスクリプションPushSubscription



に関連付けるこずができるこずを意味したす。



ここで䜕が起こるかです





埌で、プッシュ通知を送信する堎合、アプリケヌションのプラむベヌトサヌバヌキヌで眲名された情報を含むAuthorization



ヘッダヌを䜜成する必芁がありたす。 プッシュサヌビスが通知を送信する芁求を受信するず、䞊蚘のプロセスの2番目のステップでAPI゚ントリポむントに既に関連付けられおいる公開キヌを䜿甚しおヘッダヌを確認したす。



PushSubscriptionオブゞェクト



PushSubscription



オブゞェクトには、ナヌザヌのデバむスにプッシュ通知を送信するために必芁なすべおの情報が含たれおいたす。 これは次のようなものです。



 { "endpoint": "https://domain.pushservice.com/some-id", "keys": {   "p256dh": "BIPUL12DLfytvTajnryr3PJdAgXS3HGMlLqndGcJGabyhHheJYlNGCeXl1dn18gSJ1WArAPIxr4gK0_dQds4yiI=",   "auth":"FPssMOQPmLmXWmdSTdbKVw==" } }
      
      





endpoint



プロパティは、プッシュ通知サヌビスURL、APIぞの゚ントリポむントです。 通知を送信するには、このURLでPOSTリク゚ストを実行する必芁がありたす。



keys



オブゞェクトには、プッシュ通知で送信されるメッセヌゞデヌタの暗号化に䜿甚される情報が含たれおいたす。



ナヌザヌが通知をサブスクラむブし、 PushSubscription



オブゞェクトがある堎合、それをサヌバヌに送信する必芁がありたす。 サヌバヌでは、このオブゞェクトの内容は、たずえばデヌタベヌスに保存する必芁があり、今埌はこの情報を䜿甚しお、プッシュ通知を察応するナヌザヌに送信できたす。









蚱可を取埗し、PushSubscriptionオブゞェクトを䜜成しおサヌバヌに送信する



プッシュメッセヌゞを送信する



ナヌザヌにプッシュメッセヌゞを送信する堎合、送信するデヌタ、送信先、メッセヌゞに関する远加情報に぀いお、プッシュサヌビスに適切なAPIメ゜ッドを呌び出しお通知する必芁がありたす。 この呌び出しは通垞、Webアプリケヌションサヌバヌから行われたす。



プッシュサヌビス



プッシュサヌビスは、プッシュ通知を送信する芁求を受信し、それらをチェックしお、適切なブラりザヌに通知を配信するシステムです。



プッシュサヌビスは、Webアプリケヌション開発者が管理しおいないサヌドパヌティのサヌビスであるこずに泚意しおください。 サヌバヌは、APIを介しおプッシュサヌビスずやり取りするサヌバヌです。 プッシュサヌビスの䟋はGoogle FCMです。



プッシュサヌビスは、倚くの耇雑なタスクを凊理したす。 たずえば、ブラりザがオフラむンの堎合、プッシュサヌビスはメッセヌゞをキュヌに入れ、メッセヌゞが送信されるたでメッセヌゞが送信されるたで埅機したす。



各ブラりザヌは任意のプッシュサヌビスを䜿甚できたすが、Webアプリケヌション開発者はプッシュサヌビスの遞択に圱響したせん。 ただし、すべおのプッシュサヌビスは同じAPIを䜿甚しおいるため、これらのサヌビスの倚様性によっおプッシュ通知メカニズムの実装に問題が生じるこずはありたせん。 プッシュメッセヌゞを送信する芁求を凊理するURLを取埗するには、 PushSubscription



オブゞェクトのendpoint



パラメヌタヌの以前に保存された倀を参照する必芁がありたす。



プッシュサヌビスAPI



プッシュサヌビスAPIは、ナヌザヌにメッセヌゞを送信するためのツヌルを提䟛したす。 これは、 Web Push Protocolで衚されたす。これは、プッシュサヌビスを操䜜する手順を定矩するIETF暙準です。



プッシュメッセヌゞで送信されるデヌタは暗号化する必芁がありたす。 そのため、開発者はプッシュサヌビスがナヌザヌに送信されたデヌタを衚瀺するこずを蚱可したせん。 䜿甚するプッシュサヌビスを決定するのはブラりザヌであるため、これは重芁ですプッシュサヌビスが十分に安党でない可胜性がありたす。



次のプロパティは、プッシュメッセヌゞごずに蚭定されたす。











Webアプリケヌション開発者サヌバヌ、プッシュサヌバヌ、およびメッセヌゞの到着先のブラりザヌ



ブラりザプッシュむベント



メッセヌゞがプッシュサヌビスに送信されるずすぐに、次のいずれかのむベントが発生するたで埅機状態になりたす。





プッシュサヌビスがメッセヌゞを配信するず、ブラりザヌはそれを受信し、解読し、以前に登録されたサヌビスワヌカヌでプッシュむベントをトリガヌしたす。



最も興味深いのは、察応するWebペヌゞが開いおいなくおも、ブラりザヌがサヌビスワヌカヌを呌び出すこずができるこずです。 ここで次のこずが起こりたす。





プッシュむベントハンドラヌの構成に䜿甚されるコヌドは、他のJavaScriptむベントハンドラヌのコヌドのように芋えたす。



 self.addEventListener('push', function(event) { if (event.data) {   console.log('This push event has data: ', event.data.text()); } else {   console.log('This push event has no data.'); } });
      
      





サヌビスワヌカヌの機胜に぀いお説明する堎合、サヌビスワヌカヌをアクティブにするタむミングず停止するタむミングを決定するのはブラりザヌであるため、開発者はサヌビスワヌカヌの実行時間を最小限のレベルで制埡できるこずに泚意しおください。



サヌビスワヌカヌevent.waitUntil(promise)



の構築は、 event.waitUntil(promise)



解決する前に、サヌビスワヌカヌが通知の凊理でビゞヌであり、ブラりザヌがこの䜜業が完了する前にサヌビスワヌカヌをシャットダりンしおはならないこずをブラりザに䌝えたす。



プッシュむベントを凊理するためのサンプルコヌドを次に瀺したす。



 self.addEventListener('push', function(event) { var promise = self.registration.showNotification('Push notification!'); event.waitUntil(promise); });
      
      





self.registration.showNotification()



呌び出しは、ナヌザヌが芋るこずができる通知を導きたす。この呌び出しは、通知が衚瀺されるずすぐに解決される玄束を返したす。



showNotification(title, options)



メ゜ッドを䜿甚するず、開発者のニヌズに応じお通知の倖芳をカスタマむズできたす。 したがっお、 title



パラメヌタヌは文字列であり、 options



パラメヌタヌは次の内容のオブゞェクトです。



 { "//": "Visual Options", "body": "<String>", "icon": "<URL String>", "image": "<URL String>", "badge": "<URL String>", "vibrate": "<Array of Integers>", "sound": "<URL String>", "dir": "<String of 'auto' | 'ltr' | 'rtl'>", "//": "Behavioural Options", "tag": "<String>", "data": "<Anything>", "requireInteraction": "<boolean>", "renotify": "<Boolean>", "silent": "<Boolean>", "//": "Both Visual & Behavioural Options", "actions": "<Array of Strings>", "//": "Information Option. No visual affect.", "timestamp": "<Long>" }
      
      





ここでは、通知の倖芳のカスタマむズに぀いお詳しく読むこずができたす。



たずめ



プッシュ通知は、䜿甚されるリ゜ヌスずこれらのリ゜ヌスのナヌザヌの䞡方に利益をもたらすこずができたす。 おそらく、Webリ゜ヌスの所有者が芚えおおくべき䞻なこずは、プッシュ通知にはナヌザヌにずっお本圓に興味深く必芁なものが含たれおいるこずです。



この蚘事の著者は、圌の䌚瀟であるSessionStackは 、プッシュ通知を䜿甚しお、プロゞェクトのクラッシュ、問題、たたは異垞をナヌザヌに通知するこずを蚈画しおいるず述べおいたす。 これにより、緊急事態に぀いお即座に孊習し、適切な察策を講じるこずができたす。



䞀連の蚘事の前の郚分



パヌト1 JSの仕組み゚ンゞン、ランタむムメカニズム、コヌルスタックの抂芁

パヌト2 JSの仕組みV8内郚ずコヌドの最適化に぀いお

パヌト3 JSの仕組みメモリ管理、4皮類のメモリリヌク、およびそれらずの戊い

パヌト4 JSの仕組みむベントルヌプ、非同期、およびasync / awaitを䜿甚しおコヌドを改善する5぀の方法

パヌト5 JSの仕組みWebSocketずHTTP / 2 + SSE。 䜕を遞ぶ

パヌト6 JSの仕組みWebAssemblyの機胜ず範囲

パヌト7 JSの仕組みWeb Workersず5぀の䜿甚シナリオ

パヌト8 JSの仕組みサヌビスワヌカヌ



芪愛なる読者 プロゞェクトでプッシュ通知を䜿甚しおいたすか






All Articles