ããã«ã¡ã¯ ãã®çãèšäºã§ã¯ããµã€ãã«ããã·ã¥éç¥ãè¿
éãã€ç°¡åã«èšå®ããæ¹æ³ã説æããŸãã ãã®èšäºã¯ç¶²çŸ
çãªã¬ã€ãã§ã¯ãããŸããããä»åŸã®ç 究ã®åºçºç¹ãšãªãããšãé¡ã£ãŠããŸãã
ãã®ãããã¯ã«é¢ããå€ãã®æ
å ±ã¯ã€ã³ã¿ãŒãããäžã«ãããŸãããæçåãããããŸããŸãªãªãœãŒã¹ã«æ£ãã°ããJavaãC ++ãPythonã®äŸãå«ãã¢ãã€ã«ããã€ã¹ã®éç¥ãšæ··ãã£ãŠããŸãã ç§ãã¡ã¯ãWebéçºè
ãšããŠJavaScriptã«èå³ããããŸãã ãã®èšäºã§ã¯ããã¹ãŠã®å¿
èŠãã€æçšãªæ
å ±ãèç©ããããšããŸãã

ããã·ã¥éç¥ãäœã§ããããæ¢ã«ç¥ã£ãŠãããšæããŸãã ãããã§ãäž»ãªããšã«ã€ããŠç°¡åã«èª¬æããŸãã
ãµã€ãã«å
¥ããŠãŒã¶ãŒã¯ãããããããŒã¿ãååŸããŸãã ããã¯äŸ¿å©ã§å®å
šã§ãããã€ã³ã¿ãŒããããªãœãŒã¹ã®éçºã«äŒŽãããŠãŒã¶ãŒãèŠæ±ããã®ãåŸ
ããã«ããŠãŒã¶ãŒã«æ
å ±ãè¿
éã«é
ä¿¡ããå¿
èŠããããŸãã ãã®ããããµãŒããŒããã¯ã©ã€ã¢ã³ããžã®ããŒã¿ã®ããã·ã¥é
ä¿¡ã®ãã¯ãããžãŒãç»å ŽããŸããã
éèŠã§ã
ããã·ã¥éç¥ã¯ããµã€ãã«HTTPSãããå Žåã«ã®ã¿æ©èœããŸãã
æå¹ãªSSL蚌ææžããªããšãæ©èœããŸããã ãããã£ãŠãHTTPSã®ãµããŒãããŸã ãªãå Žåã¯ããããå®è¡ããæéã§ãã Let's Encryptã®äœ¿çšããå§ãããŸãã
ããŒã«ã«ãã¹ãã§å®è¡ããã«ã¯ã ããªãã¯ã«é Œãå¿
èŠããããŸãã Github Pagesã§ã¹ã¯ãªããããã¹ãããŸããã
ç®æ¬¡
è¯ãéç¥
ããã·ã¥éç¥ã¯åºåã¡ãŒã«çšã§ã¯ãªãããšãããã«äºçŽããããšæããŸãã ç¹å®ã®ãŠãŒã¶ãŒãæ¬åœã«å¿
èŠãšãããã®ãšã圌ãæ¬åœã«è¿
éã«å¿çããå¿
èŠããããã®ã ããéä¿¡ããå¿
èŠããããŸãã
è¯ãäŸïŒ
- ãã¯ãã«ã«ãµããŒãã«é£çµ¡ãããŠãŒã¶ãŒã®ã¹ããŒã¿ã¹ã®å€æŽã«é¢ããéç¥ãéä¿¡ããã
- 泚æã¹ããŒã¿ã¹ã®å€æŽã«é¢ããéç¥ã®éä¿¡ã
- ãŠãŒã¶ãŒãåŸ
ã£ãŠããååã®å庫å
ã®å€èŠ³ã
- èšäºã«å¯ŸãããŠãŒã¶ãŒã®ã³ã¡ã³ãã«è¿ä¿¡ããŸããã
- ãã°ãŸãã¯ã¯ãªãã£ã«ã«ã¹ããŒã¿ã¹ã®ãã°ãã©ãã«ãŒã®æ°ããã¿ã¹ã¯ã
æªãäŸïŒ
- å庫ãžã®æ°èŠå°çã
- ååã®å²åŒãšããã¢ãŒã·ã§ã³;
- ãµã€ãäžã®æ°ããèšäºã
- 圌ãã¯1幎åã«åœŒãæžããèšäºã«å¯ŸãããŠãŒã¶ãŒã®ã³ã¡ã³ãã«å¿çããŸããã
æªãäŸã§ãéç¥ãå¿
èŠã§ãããè¿
éã«å¯Ÿå¿ããå¿
èŠã¯ãããŸããã ãããã®éç¥ã¯ã¡ãŒã«ã§éä¿¡ã§ããŸãã äžè¬ã«ãããã·ã¥éç¥ã¯å¶åŸ¡ã§ããªãããŸããŸãªçç±ã§ãŠãŒã¶ãŒã«å±ããªãå¯èœæ§ãããããããã¹ãŠã®éèŠãªéç¥ãé»åã¡ãŒã«ã§è€è£œããããšããå§ãããŸãã ãã1ã€ã®éèŠãªèŠçŽ ã¯ãã€ãã³ãã®é¢é£æ§ã§ãã ããã«ã€ããŠã¯åŸã§èª¬æããŸãã èªãããšããå§ãããŸãïŒ
çŸã«æ»ããŸãããã ããã§ã¯ãã©ã®ããã«æ©èœããŸããïŒ ãŸããå°ãã®çè«ã
çè«
åå¿è
ã®äžã§ã¯ãããã·ã¥éç¥ã¯ç¹å¥ãªãªãœãŒã¹ãå®è£
ããå¿
èŠã®ãªãåçŽãªæè¡ã§ãããšããæèŠããããŸãã å®éã«ã¯ãããã¯ãã¯ãããžãŒã®ããŒã«å
šäœã§ãã
ã¯ããã«ããããã©ã®ããã«æ©èœãããã«ã€ããŠã®å°ããªã¢ãŠãã©ã€ã³ïŒ ã¢ãã¡ãŒã·ã§ã³ã¬ã€ã¢ãŠã ïŒïŒ

- ãµãŒããŒã¯ãŠãŒã¶ãŒã«ããŒãžãæäŸããŸãã
- ã¯ã©ã€ã¢ã³ãã¯ã¡ãã»ãŒãžãµãŒããŒã«æ¥ç¶ããIDãç»é²ããã³åä¿¡ããŸãã
- ã¯ã©ã€ã¢ã³ãã¯åä¿¡ããIDããµãŒããŒã«éä¿¡ãããµãŒããŒã¯ããã€ã¹IDã䜿çšããŠç¹å®ã®ãŠãŒã¶ãŒãç¹å®ã®ããã€ã¹ã«ãã€ã³ãããŸãã
- ãµãŒããŒã¯ã以åã«åä¿¡ããIDã䜿çšããŠãã¡ãã»ãŒãžãµãŒããŒãä»ããŠã¯ã©ã€ã¢ã³ãã«ã¡ãã»ãŒãžãéä¿¡ããŸãã
æ®å¿µãªããã誰ãã©ã®ããã«ããã€ã¹IDãäœæããã¡ãã»ãŒãžãµãŒããŒãç¹å®ã®ããã€ã¹ã«ã©ã®ããã«æ¥ç¶ãããŠããããç¥ãããšãã§ããŸããã§ããã Googleã®Firebase Cloud Messagingã¡ãã»ãŒãžãµãŒããŒãšãã®ã©ã€ãã©ãªã䜿çšããŸããã æ®å¿µãªããããµãŒããŒã«çœ®ãæããããšãã§ãããã©ãããããã³ãã®æ¹æ³ãç解ã§ããŸããã§ããã
楜ããäºå®
æåã«ã䜿çšãããã¡ãã»ãŒãžãéä¿¡ããã«ã¯ïŒ
ã¯ã©ãŠãããããã€ã¹ãžã®ã¡ãã»ãŒãžã³ã°
ãã®åŸã次ã®ãã®ã«çœ®ãæããããŸããã
Googleã¯ã©ãŠãã¡ãã»ãŒãžã³ã°
ãããŠãåã³æ¬¡ã®ããã«å€æŽãããŸããã
Firebaseã¯ã©ãŠãã¡ãã»ãŒãžã³ã°
次ã¯äœã ããã
ã¯ã©ã€ã¢ã³ãåŽã§äœãèµ·ãããŸããïŒ
- JavaScriptã¯ããŠãŒã¶ãŒã«éç¥ã衚瀺ããèš±å¯ãæ±ããŸãã
- ãŠãŒã¶ãŒãæ¿èªããå Žåãã¡ãã»ãŒãžãµãŒããŒã«æ¥ç¶ããŠããã€ã¹IDãååŸããŸãã
- ãŠãŒã¶ãŒãèå¥ããããã«ããµãŒããŒã«èå¥åãéä¿¡ããŸãã
- ããã¯ã°ã©ãŠã³ãã§åäœããJavaScript ã¯ãŒã«ãŒãåæåããã¡ãã»ãŒãžãµãŒããŒããã¡ãã»ãŒãžãåä¿¡ããŠââãŠãŒã¶ãŒã«è¡šç€ºããŸãã
- ã¡ãã»ãŒãžãµãŒããŒã«æ¥ç¶ããæ°ããå°çãåŸ
ã£ãŠããŸãã

ã泚æ
Google 㯠ãã¹ã€ããã䜿çšããŠéç¥ã賌èªããã³è³Œèªè§£é€ããããšããå§ãããŸãã ãããã£ãŠãéç¥ãµãã¹ã¯ãªãã·ã§ã³ããã»ã¹ã®éå§ã¯ããµã€ãããã§ã¯ãªãããŠãŒã¶ãŒããè¡ãããŸãã
åçä¿¡ãŠãŒã¶ãŒã®éç¥ã«ãµã€ã³ã¢ããã匷å¶ããããšã¯æªãç¿æ
£ã§ãã ããããªãã§ãã ããã
ãã¹ãŠéåžžã«è€éã«èŠããŸããããµãŒããŒäžã§ã¯ãã¹ãŠãåçŽã§ã¯ãããŸããã
ãµãŒããŒåŽã®åé¡
- ãŠãŒã¶ãŒãéä¿¡ããããã€ã¹èå¥åãããŒã¿ããŒã¹ã«ä¿åããããšã¯æããã§ãã
- ããã€ã¹èå¥åã¯ãããŒãœãã©ã€ãºãããã¡ãã»ãŒãžãéä¿¡ããããã«ãŠãŒã¶ãŒã«ãã€ã³ããããšããã§ãããã
- 1人ã®ãŠãŒã¶ãŒãããŠã圌ã¯è€æ°ã®ããã€ã¹ãæã€ããšãã§ããè€æ°ã®ãŠãŒã¶ãŒã1ã€ã®ããã€ã¹ã䜿çšã§ããããšãæãåºããŠãã ããã
- ãŠãŒã¶ãŒãžã®éç¥ã®éä¿¡ã¯æãå®äŸ¡ãªæäœã§ã¯ãªããããéç¥ã®éä¿¡ãããªã¬ãŒããã€ãã³ãã¯éä¿¡çšã®ãã¥ãŒã«å
¥ããå¿
èŠããããŸãã
- åãHTTPãªã¯ãšã¹ãäžã«ã€ãã³ãéç¥ãéä¿¡ããäœè£ãããã®ã¯ãåä¿¡è
ã®æ°ãå°ãªãå°èŠæš¡ãããžã§ã¯ãã®ã¿ã§ãã
- ãããã£ãŠãRabbitMQãRedisãªã©ã®ãã¥ãŒã€ã³ã°ã·ã¹ãã ããããŸãã
- ãã¥ãŒããã³ãã®ä»ã®ãã¥ãŒãµããŒãããŒã«ã解æããããŒã¢ã³/ã¯ãŒã«ãŒã衚瀺ãããŸãã
- éä¿¡é床ãäžããã«ã¯ãããã»ã¹ã䞊ååããè€æ°ã®ããŒãã«åæ£ã§ããŸãã
ç·Žç¿ãã
æåŸã«ãæãéèŠãªããšã«ç§»ããŸããã åè¿°ã®ãšããã Firebase Cloud Messagingãã¡ãã»ãŒãžãµãŒããŒãšããŠäœ¿çšãããããFirebaseã§ãããžã§ã¯ããç»é²ããã³äœæããããšããå§ããŸãã
ããã§ã¯ãã¹ãŠãç°¡åã§ãïŒ
- ç§ãã¡ã¯ãµã€ãã«è¡ããŸã ã
- ç»é²æžã¿ã§ãã
- ãããžã§ã¯ããæ¢ã«ããå Žåã¯ã[ æ°ãããããžã§ã¯ããäœæ ]ãŸãã¯[ Googleãããžã§ã¯ããã€ã³ããŒã ]ãã¿ã³ãã¯ãªãã¯ããŸã ã
- äœæãããšãã«ããããžã§ã¯ãã®ååãšåœãæå®ããŸãã
- ãããžã§ã¯ããäœæãããšããã®ããã·ã¥ããŒãã衚瀺ãããŸãã
- ã¡ãã¥ãŒã§ã[ æŠèŠ ]ã®æšªã«ãããã€ãŒã«ã移åãã[ ãããžã§ã¯ãèšå® ]ãéžæããŸã ã
- éããããŒãžã§ã[ ã¯ã©ãŠãã¡ãã»ãŒãžã³ã° ]ã¿ãã«ç§»åããŸãã
- ãµãŒããŒããã¡ãã»ãŒãžãéä¿¡ããããã«äœ¿çšãããServer keyãšãã¯ã©ã€ã¢ã³ãåŽã§ã¡ãã»ãŒãžãåä¿¡ããããã«äœ¿çšãããSender IDã«èå³ããããŸã ã
ããªãã¯ãŸã èšå®ãæãäžããŠã¢ã¯ã»ã¹æš©ã®åé¢ã§éã¶ããšãã§ããŸãããäžè¬ã«ãFirebaseãµã€ãã§ã®äœæ¥ã¯çµãããŸããã
ã¯ã©ã€ã¢ã³ãã®äœæãéå§ãã
ããã·ã¥éç¥ãåä¿¡ããService Workerãäœæããããšããå§ããŸãããã
次ã®å
容ã®firebase-messaging-sw.jsãã¡ã€ã«ãäœæããŸãã
// firebase-messaging-sw.js importScripts('https://www.gstatic.com/firebasejs/3.6.8/firebase-app.js'); importScripts('https://www.gstatic.com/firebasejs/3.6.8/firebase-messaging.js'); firebase.initializeApp({ messagingSenderId: '<SENDER_ID>' }); const messaging = firebase.messaging();
ã©ãã§
<SENDER_ID>
ã¯ãFirebaseãžã®ç»é²åŸã«åãåã£ãéä¿¡è
IDã§ãã
éèŠãªãç¥ãã
Service Workerãã¡ã€ã«ã¯firebase-messaging-sw.jsãšæ£ç¢ºã«åŒã°ããå¿
èŠãããããããžã§ã¯ãã®ã«ãŒãã«é
眮ããå¿
èŠããããŸã ãã€ãŸãã https: //example.com/firebase-messaging-sw.jsã§å©çšå¯èœã§ãã ãã®ãã¡ã€ã«ãžã®ãã¹ã¯ã Firebase ã©ã€ãã©ãªã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸã ã
äœæãããã³ãŒãã¯ãéç¥ã衚瀺ããã®ã«ååã§ãã è¿œå æ©èœã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã 次ã«ãFirebaseã©ã€ãã©ãªãšãµãã¹ã¯ãªãã·ã§ã³ã¹ã¯ãªãããããŒãžãã³ãã¬ãŒãã«è¿œå ããŸãã
<script type="text/javascript" src="//www.gstatic.com/firebasejs/3.6.8/firebase.js"></script> <script type="text/javascript" src="/firebase_subscribe.js"></script>
éç¥ããµãã¹ã¯ã©ã€ããããã¿ã³ãããŒãžã«è¿œå ããŸã
<button type="button" id="subscribe"> </button>
éç¥ã賌èªãã
// firebase_subscribe.js firebase.initializeApp({ messagingSenderId: '<SENDER_ID>' }); // // , Firebase, if ('Notification' in window) { var messaging = firebase.messaging(); // // if (Notification.permission === 'granted') { subscribe(); } // , // $('#subscribe').on('click', function () { subscribe(); }); } function subscribe() { // messaging.requestPermission() .then(function () { // ID messaging.getToken() .then(function (currentToken) { console.log(currentToken); if (currentToken) { sendTokenToServer(currentToken); } else { console.warn(' .'); setTokenSentToServer(false); } }) .catch(function (err) { console.warn(' .', err); setTokenSentToServer(false); }); }) .catch(function (err) { console.warn(' .', err); }); } // ID function sendTokenToServer(currentToken) { if (!isTokenSentToServer(currentToken)) { console.log(' ...'); var url = ''; // ID $.post(url, { token: currentToken }); setTokenSentToServer(currentToken); } else { console.log(' .'); } } // localStorage , // function isTokenSentToServer(currentToken) { return window.localStorage.getItem('sentFirebaseMessagingToken') == currentToken; } function setTokenSentToServer(currentToken) { window.localStorage.setItem( 'sentFirebaseMessagingToken', currentToken ? currentToken : '' ); }
以äžã§ãã ããã¯ãããã·ã¥éç¥ãåä¿¡ããããã«å¿
èŠãªãã¹ãŠã®ã³ãŒãã§ãã
ãµãŒããŒããéç¥ãéä¿¡ãã
äžè¬ã«ãéç¥ã®éä¿¡ã¯æ¬¡ã®ããã«ãªããŸãã
POST /fcm/send HTTP/1.1 Host: fcm.googleapis.com Authorization: key=YOUR-SERVER-KEY Content-Type: application/json { "notification": { "title": "", "body": " 21:00", "icon": "https://eralash.ru.rsz.io/sites/all/themes/eralash_v5/logo.png?width=40&height=40", "click_action": "http://eralash.ru/" }, "to": "YOUR-TOKEN-ID" }
ã©ãã§
YOUR-SERVER-KEY
ã¯ãFirebaseãžã®ç»é²æã«åãåã£ããµãŒããŒããŒã§ããYOUR-TOKEN-ID
ã¯ãç¹å®ã®ãŠãŒã¶ãŒã®ããã€ã¹IDã§ãã
é çªã«ãã¹ãŠã®ãã£ãŒã«ãïŒ
notification
- notification
ãã©ã¡ãŒã¿ãŒã- title-éç¥ã®ã¿ã€ãã«ã 30æåã«å¶éããŸãã
body
ããã¹ãéç¥ã 120æåã«å¶éãããŠããŸããicon
éç¥ã¢ã€ã³ã³ã ã¢ã€ã³ã³ã®ãµã€ãºã«ã¯ããã€ãã®æšæºããããŸããã192x192ã䜿çšããŠããŸãã å°ããã¢ã€ã³ã³ã¯ã¢ãã€ã«ããã€ã¹ã§ã¯èŠæ ãããããããŸãããclick_action
éç¥ãã¯ãªãã¯ããŠãŠãŒã¶ãŒãã¢ã¯ã»ã¹ããããŒãžã®URLã¢ãã¬ã¹ã- to-éç¥ã®åä¿¡è
ã®ããã€ã¹IDã
- ãªãã·ã§ã³ã®å
šãªã¹ãã¯ãã¡ã ã
ããã¯ã1人ã®åä¿¡è
ã«1ã€ã®éç¥ãéä¿¡ããäŸã§ãã 1ã€ã®éç¥ãè€æ°ã®åä¿¡è
ã«äžåºŠã«éä¿¡ã§ããŸãã äžåºŠã«æ倧1000人ã®åä¿¡è
ã
{ "notification": { "title": "", "body": " 21:00", "icon": "https://eralash.ru.rsz.io/sites/all/themes/eralash_v5/logo.png?width=192&height=192", "click_action": "http://eralash.ru/" }, "registration_ids": [ "YOUR-TOKEN-ID-1", "YOUR-TOKEN-ID-2" "YOUR-TOKEN-ID-3" ] }
ã¡ãã»ãŒãžãµãŒããŒããã®å¿çã®äŸïŒ
Chromeéç¥ { "multicast_id": 6407277574671070000, "success": 1, "failure": 0, "canonical_ids": 0, "results": [ { "message_id": "0:1489072146895227%e609af1cf9fd7ecd" } ] }
FireFoxãžã®éç¥ã®éä¿¡ { "multicast_id": 7867877497742898000, "success": 1, "failure": 0, "canonical_ids": 0, "results": [ { "message_id": "https://updates.push.services.mozilla.com/m/gAAAAABYwWmlTCKje5OLwedhNUQr9LbOCmZ0evAF9HJBnR-v7DF2KEkZY3zsT8AbrqB6JfJO6Z6vsotLJMmiIvJs9Pt1Q9oc980BRX2IU1-jlzRLIhSVVBLo2i80kBvTMYadVAMIlSIyFkWm-qg_DfLbenlO9z1S4TGMJl0XbN5gKMUlfaIjnX2FBG4XsQjDKasiw8-1L38v" } ] }
éç¥éä¿¡ãšã©ãŒ { "multicast_id": 8165639692561075000, "success": 0, "failure": 1, "canonical_ids": 0, "results": [ { "error": "InvalidRegistration" } ] }
ãšã©ãŒã³ãŒãã®å®å
šãªãªã¹ãã
ç¹å®ã®ããã°ã©ãã³ã°èšèªã«çžãããããšã¯ãããŸããããµã³ãã«ãç°¡åã«ããããã«ãcURLæ¡åŒµæ©èœä»ãã®PHPã䜿çšããŸãã éç¥éä¿¡ã¹ã¯ãªããã¯ãã³ã³ãœãŒã«ããå®è¡ããå¿
èŠããããŸãã
messaging.onMessage
messaging.onMessage
ãã³ãã©ãŒã¯ãèœãšãç©Žã®ã«ããŽãªãŒã«å±ããŠãããããç¹ã«èšåãã䟡å€ããããŸãã Firebaseã®äŸã§ã¯ããã®ãã³ãã©ãŒã䜿çšããäŸãèŠãŠããŸããã ç§ã¯FluorescentHallucinogenã«ãã£ãŠããã«ã€ããŠè©±ãããŸããã圌ã«ç¹å¥ãªæè¬ãããŸããã圌ã¯ãã®äœ¿çšã®ããã€ãã®ç¹åŸŽã«èšåããŸããã§ããã
ããã¯ã©ã®ãããªãã³ãã©ãŒã§ãã©ã®ããã«æ©èœããŸããã ããã¥ã¡ã³ããããããã·ã¥éç¥ãåä¿¡ãããšãã®ãã³ãã©ãŒãåŒã³åºããããã®æç¹ã§éç¥ãéä¿¡ããããµã€ãïŒãã€ãã£ããœãªã¥ãŒã·ã§ã³ã䜿çšããã人ã¯å®è£
äŸãåç
§ã§ããŸãïŒã«ããããšãããããŸãã ãã®æ©èœã¯ãçŸããã¢ãŒãã«ãªã©ãäœæããŠããŒãžã«éç¥ã衚瀺ã§ãããšããç¹ã§éåžžã«äŸ¿å©ã§ãã ãã®ãããªããŒãºã¯ãªãã®ã§ã æšæºã®éç¥ã衚瀺ããŸãã
if ('Notification' in window) { var messaging = firebase.messaging(); messaging.onMessage(function(payload) { console.log('Message received. ', payload); new Notification(payload.notification.title, payload.notification); }); // ... } // ...
ãã¹ãŠãã·ã³ãã«ã«æããŸãããèœãšãç©ŽããããŸãã åé¡ã¯ãã¢ãã€ã«ããã€ã¹ã§ã¯ãNotificationã³ã³ã¹ãã©ã¯ã¿ãŒã®äœ¿çšãçŠæ¢ãããŠããããšã§ãã ãã®åé¡ã解決ããã«ã¯ã ServiceWorkerRegistration.showNotification()
ã䜿çšããå¿
èŠãããããã®å Žåã®ãã³ãã©ãŒã¯æ¬¡ã®ããã«ãªããŸãã
// ... messaging.onMessage(function(payload) { console.log('Message received. ', payload); // ServiceWorker navigator.serviceWorker.register('messaging-sw.js'); // Notification.requestPermission(function(result) { if (result === 'granted') { navigator.serviceWorker.ready.then(function(registration) { // return registration.showNotification(payload.notification.title, payload.notification); }).catch(function(error) { console.log('ServiceWorker registration failed', error); }); } }); }); // ...
éç¥ã¯ãã¢ãã€ã«ããã€ã¹ã§æ©èœããããã«ãªããŸããã ããã¯ãã¹ãŠã®ããã«èŠããŸãããããã§ã¯ãããŸããã äžéšã®ä¿èšŒã«ãããããããServiceWorkerã¯ç©ºã«ããªãã§ãã ããã ãŠãŒã¶ãŒãã¯ãªãã¯ããå¿
èŠã®ããããŒãžãã¯ãªãã¯ããããã«ããŸãã ãããè¡ãã«ã¯ãServiceWorkerã«éç¥ã¯ãªãã¯ãã³ãã©ãŒãè¿œå ããå¿
èŠããããŸãã
click_action
ããããã£ã«ã¢ã¯ã»ã¹ããããã®éç¥èšå®ãä¿åããŸãã
// ... navigator.serviceWorker.ready.then(function(registration) { payload.notification.data = payload.notification; // registration.showNotification(payload.notification.title, payload.notification); }).catch(function(error) { console.log('ServiceWorker registration failed', error); }); // ...
ServiceWorkerã§éç¥ã¯ãªãã¯ãåŠçããŸãã
// messaging-sw.js self.addEventListener('notificationclick', function(event) { const target = event.notification.data.click_action || '/'; event.notification.close(); // // , event.waitUntil(clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function(clientList) { // clientList - !? for (var i = 0; i < clientList.length; i++) { var client = clientList[i]; if (client.url == target && 'focus' in client) { return client.focus(); } } // return clients.openWindow(target); })); });
TTLããã³è¿œå ã®éç¥å¶åŸ¡
éç¥ã®ããã®éèŠãªããããã£ã¯ããã®é¢é£ã®æéãããããŸããã ããã¯ããžãã¹ããã»ã¹ã«äŸåããŸãã ããã©ã«ãã§ã¯ãéç¥ã®æå¹æéã¯4é±éã§ãã ããã¯ããã®çš®ã®éç¥ã«ã¯å€ãã®æ©èœããããŸãã ããšãã°ãããæ°ã«å
¥ãã®çªçµã¯15ååŸã«éå§ããŸãããšããéç¥ã¯ã15åéé¢é£ããŠããŸãã ãã®åŸãã¡ãã»ãŒãžã¯é¢ä¿ãªããã衚瀺ãããŸããã 0ã2419200ç§ã®å€ãæã€time_to_live
ããããã£ã¯ãã©ã€ãã¿ã€ã ã®å¶åŸ¡ãæ
åœããŸãã 詳现ã¯ããã¥ã¡ã³ããã芧ãã ããã æå®ãããTTLãæã€ã¡ãã»ãŒãžã¯æ¬¡ã®ããã«ãªããŸãã
{ "notification": { "title": "", "body": " 15 ", "icon": "https://eralash.ru.rsz.io/sites/all/themes/eralash_v5/logo.png?width=192&height=192", "click_action": "http://eralash.ru/" }, "time_to_live": 900, "to": "YOUR-TOKEN-ID" }
ããæ°ã«å
¥ãã®çªçµã¯15åã§éå§ããŸãããªã©ã®ã¡ãã»ãŒãžã¯15åéé¢é£ããŠããŸãããéä¿¡åŸ1å以å
ã«äžæ£ç¢ºã«ãªããŸãã 転éã¯15ååŸã§ã¯ãªã14ååŸã«éå§ãããããããã®ãããªç¶æ³ã¯ã¯ã©ã€ã¢ã³ãåŽã§å¶åŸ¡ããå¿
èŠããããŸãã
ãããè¡ãã«ã¯ããµãŒããŒããéä¿¡ãããã¡ãã»ãŒãžãå€æŽããŸãã
{ "data": { "title": "", "time": 1489006800, "icon": "https://eralash.ru.rsz.io/sites/all/themes/eralash_v5/logo.png?width=192&height=192", "click_action": "http://eralash.ru/" }, "time_to_live": 900, "to": "YOUR-TOKEN-ID" }
notification
ãã£ãŒã«ããdata
å€æŽãããŠããããšã«æ³šæããŠãã ããã ããã§ãããã©ã«ãã®Firebaseãã³ãã©ãŒã¯åŒã³åºãããªããªããç¬èªã«ãããè¡ãå¿
èŠããããŸãã firebase-messaging-sw.js
ã®æåŸã«æ¬¡ã®è¡ãè¿œå ãfirebase-messaging-sw.js
ã
// messaging.setBackgroundMessageHandler(function(payload) { if (typeof payload.data.time != 'undefined') { var time = new Date(payload.data.time * 1000); var now = new Date(); if (time < now) { // return null; } var diff = Math.round((time.getTime() - now.getTime()) / 1000); // // : " 14 , 21:00" payload.data.body = ' ' + Math.round(diff / 60) + ' , ' + time.getHours() + ':' + (time.getMinutes() > 9 ? time.getMinutes() : '0' + time.getMinutes()) ; } // data payload.data.data = payload.data; // return self.registration.showNotification(payload.data.title, payload.data); }); // self.addEventListener('notificationclick', function(event) { // const target = event.notification.data.click_action || '/'; event.notification.close(); // // , event.waitUntil(clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function(clientList) { // clientList - !? for (var i = 0; i < clientList.length; i++) { var client = clientList[i]; if (client.url == target && 'focus' in client) { return client.focus(); } } // return clients.openWindow(target); })); });
ãã®ãããªç°¡åãªæ¹æ³ã§ãéç¥ãå®å
šã«å¶åŸ¡ã§ããŸããã æãèå³æ·±ãã®ã¯ããŠãŒã¶ãŒã«èªåã®ã¿ã€ã ãŸãŒã³ã§éç¥æéã衚瀺ããããšã§ãã ããã¯ãäžçäžã§æ©èœãããµãŒãã¹ããæ¯ãã·ã¢ã®ããã«ã¿ã€ã ãŸãŒã³ãåºç¯å²ã«åºããå°åã«åœãŠã¯ãŸããŸãã
ãããã«
ããŠãæ²ããããšã«ã€ããŠè©±ããŸãããã ãã¯ãããžãŒã®ãã¹ãŠã®é
åã«ãããããããå€ãã®æ¬ ç¹ããããŸãã
- äž»ãªåé¡ã¯ããã€ãã®ããã«ã ãã©ãŠã¶ã®ãµããŒãã§ãã ChromeãFirefoxãOperaã®ææ°ããŒãžã§ã³ã§ã¯å®å
šã«ãµããŒããããŠããŸãã IEãSafariãOpera MiniãUC BrowserãDolphinãããã³ãã®ä»ã®å
åŒã¯é€å€ãããŠããŸãã ãã ããã¢ãã€ã«çã®ChromeãFirefoxãOperaãã©ãŠã¶ãŒã§ã¯æ©èœããŸãã
- ãªãŒãã³ãµã€ããšå®è¡äžã®Service Workerã¯ãã¡ãã»ãŒãžé
ä¿¡ãä¿èšŒããŸããã ãã ããéç¥ã¯éãããã©ãŠã¶ãŒã§çºçããå ŽåããããŸãã
Firebaseã©ã€ãã©ãªã¯å€ãã®ç§å¯ãé ããŠããããã®ç 究ã¯ããã€ãã®è³ªåã«å¯ŸããçããæäŸããå¯èœæ§ããããŸãããããã¯ãã®èšäºã®ç¯å²å€ã§ãã
ãã¬ã€ãã
GitHub Pagesãããžã§ã¯ã
Service Workerãèµ·åããã«ã¯HTTPSãå¿
èŠãªã®ã§ãæãç°¡åãªè§£æ±ºçã¯ãããžã§ã¯ããGitHub Pagesã«çœ®ãããšã§ããã
ãããžã§ã¯ãã¯ã https ïŒ //github.com/peter-gribanov/serviceworkerã§å
¥æã§ããŸãã
ãããžã§ã¯ãã®ãœãŒã¹ïŒ https : //peter-gribanov.imtqy.com/serviceworker/
ãããžã§ã¯ãã¯ãéç¥ãéåä¿¡ããããã®å®å
šãªã¢ããªã±ãŒã·ã§ã³ã§ãã éç¥ãåä¿¡ããã«ã¯ã次ã®ããšãå¿
èŠã§ãã
- ããŒãžã«ç§»åããŸã ã
- [ ç»é² ]ãã¿ã³ãã¯ãªãã¯ããŸãã
- ãã©ãŠã¶ã¯éç¥ã衚瀺ããèš±å¯ãèŠæ±ããŸãã
- èš±å¯ã確èªããŸã;
- 端æ«ã®IDã¯ããŒãžãšãã©ãŠã¶ã³ã³ãœãŒã«ã«å°å·ãããŸãã
- [ããŒã¯ã³ã®åé€]ãã¿ã³ã衚瀺ãããæ¢åã®ããŒã¯ã³ãåé€ããŠåç»é²ããŸãã
- [ éä¿¡ ]ãã¿ã³ãã¯ãªãã¯ããŠéä¿¡ã§ããéç¥ãã©ã¡ãŒã¿ãŒãå«ããã©ãŒã ã衚瀺ãããŸãã
- èªç±è£éã§ãã©ã¡ãŒã¿ãå€æŽããç°ãªãéç¥ãåãåããŸãã
HTTPãªã¯ãšã¹ããéä¿¡ããã«ã¯ãä»»æã®ããŒã«ã䜿çšããŠéç¥ãéä¿¡ã§ããŸãã cURLã䜿çšã§ããŸããChromeçšã®Postmanã¢ããªã®æ¹ã奜ãã§ãã
èŠæ±ã¯ãåè¿°ã®ãšããã§ãã
POST /fcm/send HTTP/1.1 Host: fcm.googleapis.com Authorization: key=AAAAaGQ_q2M:APA91bGCEOduj8HM6gP24w2LEnesqM2zkL_qx2PJUSBjjeGSdJhCrDoJf_WbT7wpQZrynHlESAoZ1VHX9Nro6W_tqpJ3Aw-A292SVe_4Ho7tJQCQxSezDCoJsnqXjoaouMYIwr34vZTs Content-Type: application/json { "data": { "title": "", "body": " 21:00", "icon": "https://eralash.ru.rsz.io/sites/all/themes/eralash_v5/logo.png?width=192&height=192", "click_action": "http://eralash.ru/" }, "to": "YOUR-TOKEN-ID" }
ã©ãã§
以äžã§ãã ç§ãã¡ã¯éç¥ãåãåãã人çã楜ãã¿ãŸãã
åç
§è³æ
é¢é£ãªã³ã¯ãªã¹ã- PUSHã«ã€ããŠ
- SSL
- UI
- JavaScript API
- éç¥ãéä¿¡ãã
- ãã¬ã€ãã
- Firebaseããã®ã¯ã€ãã¯ã¹ã¿ãŒã
- GitHubããŒãžã§
- ç§ã®ãµã€ãã§
2018-06-09ã«æŽæ°
ããã€ãã®ãæ©èœããéç¥ã®äœæ¥ã§èŠã€ãããŸããã
éè€ããéç¥
ãéè€ããéç¥ãä¿®æ£ããæ¹æ³ã¯ïŒããšãã質åã§äœåºŠãå°ããããŸããã
ãã®åé¡ã¯ãè€æ°ã®ã¿ãã§åæã«éç¥ãéä¿¡ãããµã€ããéããšæããã«ãªããŸãã ãã®å ŽåãService Workerã¯äž¡æ¹ã®ã¿ãã«éç¥ãéä¿¡ãã messaging.onMessageã¡ãœãããäž¡æ¹ã®ã¿ãã§èµ·åããŸãã ãã®åé¡ã¯ãç§ã®ãã¢ãããžã§ã¯ãã§ç¢ºèªã§ããŸãã
ãã®åé¡ã解決ããã«ã¯ã messaging.onMessage
ã¡ãœããã§ãéç¥ããã§ã«å¥ã®ã¿ãã«è¡šç€ºãããŠããããšãç¥ãå¿
èŠããããŸãã localStorage
ãåäžã®ã¹ãã¢ãšããŠäœ¿çšlocalStorage
ãéç¥éã®ããã·ã¥ã«ãã£ãŠéç¥ãèå¥ããããäžæã®IDãå²ãåœãŠãããšãã§ããŸãã localStorage
ãŽã ã§localStorage
ãªããæ¢ã«è¡šç€ºãããŠããéç¥ã®IDã¯ãã°ããããŠããã¯ãªãŒã³ã¢ããããå¿
èŠãããããšã«æ³šæããŠãã ããã
ãããã®ç®çã®ããã«pamelafox / lscacheã©ã€ãã©ãªããå§ãã§ããŸãã
åé¡ã解決ããå¥ã®æ¹æ³ãããå Žåã¯ãã³ã¡ã³ããæžããŠãã ããã
éç¥ã®åç
ä»æ¥ã CTteroristã®ãŠãŒã¶ãŒãç§ã«ç®ãåããŸããã圌ã¯éç¥ã«ç»åã衚瀺ãããŠããªãããšã«æ°ä»ããŸããã
å°ããã¹ãããŠãç§ã¯ãããç解ããããšãã§ããŸããã image
ãã£ãŒã«ãã¯ä»ã®éç¥ãã©ã¡ãŒã¿ãŒãšãšãã«Firebaseã«éä¿¡ãããŸããã image
ãã£ãŒã«ãã¯Firebaseããè¿ãããŸããã åé¡ã¯éåžžã«ç°¡åã«è§£æ±ºãããŸãã data
ãã£ãŒã«ãã§ã«ãŒããéä¿¡ããéç¥è¡šç€ºãã³ãã©ãŒã§data
ããç»åãæœåºããéç¥ã®æå®ã®å Žæã«æ¿å
¥ã§ããŸãã
ã€ãŸãããã®ãã©ãŒã ã§ã¡ãã»ãŒãžãéä¿¡ãããšãFirebaseã¯ç»åã倱ããŸãã
{ "notification": { "title": "Bubble Nebula", "body": "It's found today at 21:00", "icon": "https://peter-gribanov.imtqy.com/serviceworker/Bubble-Nebula.jpg", "image": "https://peter-gribanov.imtqy.com/serviceworker/Bubble-Nebula_big.jpg", "click_action": "https://www.nasa.gov/feature/goddard/2016/hubble-sees-a-star-inflating-a-giant-bubble" }, "to": "YOUR-TOKEN-ID" }
ãã ããç»åãdata
転éãããšãç»åã衚瀺ããdata
ã
{ "data": { "title": "Bubble Nebula", "body": "It's found today at 21:00", "icon": "https://peter-gribanov.imtqy.com/serviceworker/Bubble-Nebula.jpg", "image": "https://peter-gribanov.imtqy.com/serviceworker/Bubble-Nebula_big.jpg", "click_action": "https://www.nasa.gov/feature/goddard/2016/hubble-sees-a-star-inflating-a-giant-bubble" }, "to": "YOUR-TOKEN-ID" }
éç¥è¡šç€ºãã³ãã©ãŒã¯ãäžèšã®äŸãšåãã§ãã
messaging.onMessage(function(payload) { console.log('Message received. ', payload); // ServiceWorker navigator.serviceWorker.register('firebase-messaging-sw.js'); // Notification.requestPermission(function(result) { if (result === 'granted') { navigator.serviceWorker.ready.then(function(registration) { // TTL .. // data payload.data.data = JSON.parse(JSON.stringify(payload.data)); registration.showNotification(payload.data.title, payload.data); }).catch(function(error) { console.log('ServiceWorker registration failed', error); }); } }); });
åæ§ã«ãService WorkerïŒ firebase-messaging-sw.js
ïŒ
messaging.setBackgroundMessageHandler(function(payload) { console.log('Handling background message', payload); // TTL .. // data payload.data.data = JSON.parse(JSON.stringify(payload.data)); registration.showNotification(payload.data.title, payload.data); });