[ã¢ããã€ã¹ãèªã]ãµã€ã¯ã«ã®ä»ã®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ã®ä»çµã¿ïŒã«ã¹ã¿ã èŠçŽ
ããŒã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ã€ã®æé ãå®è¡ããå¿ èŠããããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®æºåã ãã®ã¹ãããã§ã¯ããŠãŒã¶ãŒãéç¥ããµãã¹ã¯ã©ã€ãã§ããã¡ã«ããºã ãæºåããŸãã
- ããã·ã¥ã¡ãã»ãŒãžãéä¿¡ããŸãã ãã®ã¹ãããã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³éçºè
ã®ãµãŒããŒã§ã察å¿ããAPIã«ã¢ã¯ã»ã¹ããŸããããã«ããããŠãŒã¶ãŒã®ããã€ã¹ã«éç¥ãéä¿¡ãããŸãã
- ããã·ã¥ã¡ãã»ãŒãžãåä¿¡ããŸãã ãã®ã¹ãããã§ã¯ãããã·ã¥ã¡ãã»ãŒãžã¯ãã©ãŠã¶ã«é
ä¿¡ãããåŸã«åŠçãããŸãã
ããããã¹ãŠè©³çŽ°ã«æ€èšããŠãã ããã
ãã©ãŠã¶ã®æ©èœã確èªãã
ãŸããçŸåšã®ãã©ãŠã¶ãããã·ã¥éç¥ããµããŒãããŠãããã©ããã確èªããå¿ èŠããããŸãã ããã¯ã次ã®ãã§ãã¯ãå®è¡ããããšã§å®è¡ã§ããŸãã
-
navigator
ãªããžã§ã¯ãã§serviceWorker
ã確èªããŸãã -
window
ãªããžã§ã¯ãå ã®PushManager
ã®ååšã確èªããŸãã
ããã¯æ¬¡ã®ãããªãã®ã§ãã
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
ãªããžã§ã¯ããåãå ¥ããŸãããã®ããã€ãã¯ãªãã·ã§ã³ã§ãã
-
userVisibleOnly
ã ãã®è«çå€ã¯ãçæããããµãã¹ã¯ãªãã·ã§ã³ãã¡ãã»ãŒãžã®è¡šç€ºã®ã¿ã«äœ¿çšãããããšã瀺ããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯true
ã«èšå®ããå¿ èŠããããŸããèšå®ããªããšãšã©ãŒãçºçããŸãïŒããã«ã¯æŽå²çãªçç±ããããŸãïŒã -
applicationServerKey
ã ããã¯ãBase64ã§ãšã³ã³ãŒããããDOMString
ããŸãã¯ããã·ã¥ãµãŒããŒãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã®èªèšŒã«äœ¿çšããå ¬éããŒãå«ãArrayBuffer
ãªããžã§ã¯ãã§ãã
Webã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã¯ããµãŒããŒã«åºæã®ã¢ããªã±ãŒã·ã§ã³ããŒã®ãã¢ãçæããå¿ èŠããããŸãïŒVAPIDããŒãšãåŒã°ããŸãïŒã ãã®ãã¢ã«ã¯å ¬ééµãšç§å¯éµãå«ãŸããŸãã ãµãŒããŒã¯ç§å¯éµãç§å¯ã«ä¿ã¡ãå ¬ééµãã¯ã©ã€ã¢ã³ãã«è»¢éããŸãã ããŒã«ãããããã·ã¥éç¥ãµãŒãã¹ã¯ãã©ã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããŠãŒã¶ãŒã«ãµã€ã³ã¢ããããããèªèããç¹å®ã®ãŠãŒã¶ãŒã«éç¥ãéä¿¡ãããµãŒããŒãšåããµãŒããŒã§ããããšã確èªã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ããŒãã¢ã¯ãäžåºŠã ãäœæããå¿ èŠããããŸãã ããŒãçæããã«ã¯ã ãã¡ããã芧ãã ãã ã
ãã©ãŠã¶ãŒã¯ããµãã¹ã¯ãªãã·ã§ã³ããã»ã¹äžã«
applicationServerKey
ïŒå ¬éããŒïŒãããã·ã¥ãµãŒãã¹ã«æž¡ããŸãã ããã¯ãããã·ã¥ãµãŒãã¹ãã¢ããªã±ãŒã·ã§ã³ã®å ¬éããŒããµãã¹ã¯ãªãã·ã§ã³
PushSubscription
ã«é¢é£ä»ããããšãã§ããããšãæå³ããŸãã
ããã§äœãèµ·ãããã§ãïŒ
- Webã¢ããªã±ãŒã·ã§ã³ã¯ããµãŒããŒããŒãæž¡ããŠ
subscribe()
ããŒãããŠåŒã³åºããŸãã
- ãã©ãŠã¶ãŒã¯ãããã·ã¥ãµãŒãã¹ã«å¯ŸããŠãããã¯ãŒã¯èŠæ±ãè¡ããŸããããã·ã¥ãµãŒãã¹ã¯ãç¬èªã®APIãžã®ãšã³ããªãã€ã³ãã®ã¢ãã¬ã¹ãçæãããã®ã¢ãã¬ã¹ãããŒã«é¢é£ä»ããŠããã©ãŠã¶ãŒã«é¢ããæ
å ±ãè¿ããŸãã
- ãã©ãŠã¶ã¯ããã®æ
å ±ã
PushSubscription
ãªããžã§ã¯ãã«è¿œå ããŸãããã®ãªããžã§ã¯ãã¯ãsubscribe()
promiseãéããŠè¿ãããŸãã
åŸã§ãããã·ã¥éç¥ãéä¿¡ããå Žåãã¢ããªã±ãŒã·ã§ã³ã®ãã©ã€ããŒããµãŒããŒããŒã§çœ²åãããæ å ±ãå«ã
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æšæºã§ãã
ããã·ã¥ã¡ãã»ãŒãžã§éä¿¡ãããããŒã¿ã¯æå·åããå¿ èŠããããŸãã ãã®ãããéçºè ã¯ããã·ã¥ãµãŒãã¹ããŠãŒã¶ãŒã«éä¿¡ãããããŒã¿ã衚瀺ããããšãèš±å¯ããŸããã 䜿çšããããã·ã¥ãµãŒãã¹ã決å®ããã®ã¯ãã©ãŠã¶ãŒã§ãããããããã¯éèŠã§ãïŒããã·ã¥ãµãŒãã¹ãååã«å®å šã§ãªãå¯èœæ§ããããŸãïŒã
次ã®ããããã£ã¯ãããã·ã¥ã¡ãã»ãŒãžããšã«èšå®ãããŸãã
-
TTL
æªé ä¿¡ã®ããã·ã¥éç¥ãåé€ãããåã«ãã¥ãŒã§è²»ããããšãã§ããæéã決å®ããŸãã
-
Priority
-ã¡ãã»ãŒãžã®åªå 床ãèšå®ããŸããããã«ããããŠãŒã¶ãŒã®ããã€ã¹ã®ããããªãŒé»åãç¯çŽããå¿ èŠãããå Žåã«ãããã·ã¥ãµãŒãã¹ã¯åªå 床ã®é«ãã¡ãã»ãŒãžã®ã¿ãéä¿¡ã§ããŸãã
-
Topic
-ããã·ã¥éç¥ã«ãããã¯åãå²ãåœãŠãŸããããã«ãããåããããã¯ã§é ä¿¡ãåŸ æ©ããŠããã¡ãã»ãŒãžã眮ãæããããŸãã ãã®çµæããŠãŒã¶ãŒã®ããã€ã¹ãã¢ã¯ãã£ãã«ãªããšããã«ããŠãŒã¶ãŒã¯ææ°ã®ã¡ãã»ãŒãžãåãåããŸãã

Webã¢ããªã±ãŒã·ã§ã³éçºè ãµãŒããŒãããã·ã¥ãµãŒããŒãããã³ã¡ãã»ãŒãžã®å°çå ã®ãã©ãŠã¶ãŒ
ãã©ãŠã¶ããã·ã¥ã€ãã³ã
ã¡ãã»ãŒãžãããã·ã¥ãµãŒãã¹ã«éä¿¡ããããšããã«ã次ã®ããããã®ã€ãã³ããçºçãããŸã§åŸ æ©ç¶æ ã«ãªããŸãã
- ããã€ã¹ã¯ãªã³ã©ã€ã³ã§ãã
- TTLãã©ã¡ãŒã¿ãŒã§æå®ãããã¡ãã»ãŒãžä¿ææéãåããŸããã
ããã·ã¥ãµãŒãã¹ãã¡ãã»ãŒãžãé ä¿¡ãããšããã©ãŠã¶ãŒã¯ãããåä¿¡ãã解èªãã以åã«ç»é²ããããµãŒãã¹ã¯ãŒã«ãŒã§ããã·ã¥ã€ãã³ããããªã¬ãŒããŸãã
æãèå³æ·±ãã®ã¯ã察å¿ããWebããŒãžãéããŠããªããŠãããã©ãŠã¶ãŒããµãŒãã¹ã¯ãŒã«ãŒãåŒã³åºãããšãã§ããããšã§ãã ããã§æ¬¡ã®ããšãèµ·ãããŸãã
- ããã·ã¥éç¥ããã©ãŠã¶ã«å±ãããã©ãŠã¶ã¯ããã解èªããŸãã
- ãã©ãŠã¶ã¯Service Workerãã¢ã¯ãã£ãã«ããŸãã
- ããã·ã¥ã€ãã³ãã¯ãµãŒãã¹ã¯ãŒã«ãŒã«ãã£ã¹ããããããŸãã
ããã·ã¥ã€ãã³ããã³ãã©ãŒã®æ§æã«äœ¿çšãããã³ãŒãã¯ãä»ã®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ã®ä»çµã¿ïŒãµãŒãã¹ã¯ãŒã«ãŒ
芪æãªãèªè ïŒ ãããžã§ã¯ãã§ããã·ã¥éç¥ã䜿çšããŠããŸããïŒ