-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathfcm.html
156 lines (134 loc) · 47.2 KB
/
fcm.html
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<html>
<head>
<title>Firebase Cloud Messaging Web Client App</title>
</head>
<body id="body" style="min-width: 650px;font-family: Open Sans;background-color:#cfe1fb;">
<style>button,button:hover{color:#fff;padding:5px 10px}.container,.container input:checked~.checkmark:after{display:block}p.info,pre{word-wrap:break-word}button{border-radius:4px;border:1px solid #06c;background-color:#050461;cursor:pointer;min-width:100px}button:hover{border:1px solid #61bbef;background-color:#62afce}button:disabled,button[disabled]{border:1px solid #8c9098;background-color:#d3d3d7;color:#666;cursor:not-allowed}img{margin:-20px 0}.container{position:relative;padding-left:28px;margin-bottom:10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:80px}.input-container,label{display:inline-block}.container input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.checkmark{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#eee}.container:hover input~.checkmark{background-color:#ccc}.container input:checked~.checkmark,.textarea,select{background-color:#62afce}.checkmark:after{content:"";position:absolute;display:none}.container .checkmark:after{left:6px;top:3px;width:5px;height:10px;border:solid #fff;border-width:0 3px 3px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}input[type=number],input[type=text]{background-color:#62afce;color:#fff;border-radius:4px;border:3px solid #3bb1dc;padding:6px;width:100%;font-size:15px;box-sizing:border-box;-webkit-transition:.5s;transition:.5s;outline:0}.textarea:focus,input[type=number]:focus,input[type=text]:focus{background-color:#1580aa}select{width:30%;padding:8px;border:none;border-radius:4px;color:#fff}.textarea{border-radius:4px;resize:none;border:none;-webkit-transition:.5s;transition:.5s;outline:0;width:94%;color:#fff;padding:10px}p.info{height:80px;overflow-y:auto;max-width:610px}.input-container{width:98%;max-width:609px}.input-container input:active,.input-container input:focus{outline:0}.input-container input{width:80%;border:none}.input-container button{float:right}.tab{overflow:hidden;border:1px solid #62afce;background:0 0;border-radius:0}.tab button{background-color:inherit;float:left;border:none;outline:0;cursor:pointer;padding:14px 16px;transition:.3s;color:#000;border-radius:0}.tab button:hover{background-color:#b0d9ea}.tab button.active{background-color:#71ccf0}.tabcontent{display:none;padding:6px 12px;border:1px solid #62afce;border-top:none}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(data:font/woff2;base64,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) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}</style>
<h3>Firebase Cloud Messaging Web Client</h3>
<div style="line-height:1.5em;max-width:610px;">
<div class="tab">
<button class="tablinks" id="instructionTabBtn">Instructions</button>
<button class="tablinks" id="setupTabBtn">Initialization</button>
<button class="tablinks" id="receiveTabBtn">Received Message</button>
<button class="tablinks" id="composeTabBtn">Compose Message</button>
</div>
<div id="instructionTab" class="tabcontent">
<h3>Instruction</h3>
<div id="longDiv" style="overflow-y: auto;max-height: 558px;">
1. Place the <span id="url1"></span> files in the root directory of the web server.<br /><br />
The web server can be local host e.g. <a href="https://www.apachefriends.org/download.html"
target="_blank">XAMMP</a>, <a href="https://www.uniformserver.com/"
target="_blank">UiformServer</a>, phython and Node.js.<br /><br />
When you host the web app on remote server, browser should navigate through the HTTPS protocol
(https://) because FCM SDK is supported only in pages served over HTTPS.<br /><br />
When you host the web app on local host, browser can navigate through http://localhost.<br /><br />
2. Under the <b>Initialization</b> tab, specify the information from <a
href="https://console.firebase.google.com/project/_/settings/general/" target="_blank">Project
settings > General > Your apps</a><br /><br />
The <b>VAPID</b> key can be taken from the <b>Web Push certificates</b> section under <a
href="https://console.firebase.google.com/project/_/settings/cloudmessaging/web"
target="_blank">Project settings > Cloud Messaging</a><br /><br />
3. Click the <b>Initialize & Get Token</b> button to initialize your Firebase Cloud Messaging Web Client
and get the registration token to test with your Arduino device.<br /><br />
You also have to allow or enable notification for your web server site URL in your web browser
settings or
pop-up.<br /><br />
After the registration token was generated, you can now use for the registeration token in your
Arduino code.<br /><br />
4. Click the <b>Download SW File</b> button to download the service worker javascript file that is
required for allowing background message notification.<br /><br />
Save the <b>firebase-messaging-sw.js</b> that downloaded to the same directory (root) of this
<b><span id="url2"></span></b> file.<br /><br />
In case you can't download file, you can also create a new <b>firebase-messaging-sw.js</b> by
click the <b>Copy SW Content</b> button and paste it to your <b>firebase-messaging-sw.js</b>
file and save to the root directory.<br /><br />
5. Reload this page and click the <b>Initialize & Get Token</b> button again. Now your web client
is ready to receive the messages.<br /><br />
In Windows 11 PC, even notification is granted for your site in the brower notification settings, the
notification may go directly to the notification center instead of displaying pop-up, if <b>Do not
disturb</b> is <b>On</b> in the <a href="ms-settings:notifications"><b>System >
Notifications</b></a> and you have to turn it <b>Off</b> to allow the notification pop-up to
show.<br /><br />
6. To compose and send the message, under the <b>Compose Message</b> tab, the <b>Client Email</b> and
<b>Private Key</b> are taken from the <b>Service Account</b> key file which required for the FCM HTTPv1
API authorization.<br /><br />
If you don't want to send the message using this app, you can ignore it.<br /><br />
The message to be sent should be valid <a
href="https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages" target="_blank">HTTP
v1 FCM messages</a> format.
</div>
</div>
<div id="setupTab" class="tabcontent">
<h3>Initialization</h3>
<div style="overflow-y: auto;height: 558px;">
<form style="max-width:650px;">
<label for="projectId" style="min-width:115px;">Project ID:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="projectId" name="projectId"><br />
<label for="apiKey" style="min-width:115px;">API Key:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="apiKey" name="apiKey"><br />
<label for="appId" style="min-width:115px;">App ID:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="appId" name="appId">
<label for="senderId" style="min-width:115px;">Sender ID:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="senderId" name="senderId"><br />
<label for="vapidKey" style="min-width:115px;">VAPID Key:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="vapidKey" name="vapidKey">
</form>
<div class="input-container">
<label for="iidToken" style="min-width:115px;">Regis. Token:</label>
<input type="text" style="margin-bottom:10px;width:68%;background-color: #c2cad1;border: none;"
id="iidToken" name="iidToken" class="input-field" readonly>
<button class="input-button" style="min-width:50px;" id="tokenCopyBtn">Copy</button>
</div>
<hr class="rounded">
<p class="info" id="appStatus" style="height: 190px;"></p>
<hr class="rounded">
<div style="margin-top:10px;margin-bottom:10px;">
<button type="button" id="initializeBtn" style="padding:5px;color:rgb(254, 254, 254);"
title="Initialize">Initialize & Get Token</button> <button type="button" id="deleteTokenBtn"
style="padding:5px;color:rgb(254, 254, 254);" title="Delete Token">Delete Token</button> <button
type="button" id="getSwBtn" style="padding:5px;color:rgb(254, 254, 254);"
title="Download Service Worker file">Download
SW File</button> <button type="button" id="copySwBtn"
style="padding:5px;color:rgb(254, 254, 254);" title="Copy Service Worker file">Copy SW
Content</button>
</div>
</div>
</div>
<div id="receiveTab" class="tabcontent">
<button id="clearMsgBtn" style="min-width:30px;display:none;float:right;margin-top:15px;">Clear</button>
<h3 id="receiveHeader">Uninitialized</h3>
<div style="max-width: 610px;overflow-y: auto;height: 558px;">
<div id='messages'
style="text-wrap: wrap;border:none;width:96%;display:block;height:360px;max-width: 610px;overflow-y: auto;background: transparent;"
class="textarea" id="listener" name="listener" rows="10" cols="50"></div>
<hr class="rounded">
<p class="info" id="receiveStatus" style="min-height: 30px;"></p>
</div>
</div>
<div id="composeTab" class="tabcontent">
<div style="overflow-y: auto;height: 620px;max-width:650px;">
<h3>Authorization Credentials</h3>
<label for="clientEmail" style="min-width:115px;">Client Email:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="clientEmail" name="clientEmail"><br />
<label for="privateKey" style="min-width:115px;">Private Key:</label>
<input type="text" style="margin-bottom:10px;width:78%;" id="privateKey" name="privateKey"><br />
<hr class="rounded">
<h3>Compose Message</h3>
<label for="msgPayload" style="min-width:115px;">Message:</label> <button id="loadMsgBtn"
style="float:right;min-width:30px;margin-right: 10px;margin-bottom:3px;">Sample</button><br />
<textarea class="textarea"
style="border:none;width:98%;display:block;height:190px;max-width: 610px;overflow-y: auto;"
id="msgPayload" name="msgPayload" rows="10" cols="50"></textarea>
<hr class="rounded">
<p class="info" id="sendStatus" style="min-height: 30px;"></p>
<hr class="rounded">
<div style="margin-top:10px;margin-bottom:10px;">
<button type="button" id="msgSendBtn" style="padding:5px;color:rgb(254, 254, 254);"
title="send">Send</button>
</div>
</div>
</div>
</div>
<script type="module">import{initializeApp as e,deleteApp as t}from"https://www.gstatic.com/firebasejs/11.2.0/firebase-app.js";import{getAuth as a}from"https://www.gstatic.com/firebasejs/11.2.0/firebase-auth.js";import{deleteToken as s,getMessaging as n,getToken as o,onMessage as i}from"https://www.gstatic.com/firebasejs/11.2.0/firebase-messaging.js";let firebaseConfig={apiKey:"",projectId:"",messagingSenderId:"",appId:""};var appStatusTmo,receiveStatusTmo,sendStatusTmo,permissionTmo,receiveMsgTmo,app,messaging,vapidKey=void 0,onMsgCallback=!1,accessToken="",tokenTime=0,path=window.location.pathname,curPage=decodeURI(path.split("/").pop());function getEl(e){return document.getElementById(e)}function initializeFCM(){firebaseConfig.apiKey=getEl("apiKey").value.trim(),firebaseConfig.projectId=getEl("projectId").value.trim(),firebaseConfig.messagingSenderId=getEl("senderId").value.trim(),firebaseConfig.appId=getEl("appId").value.trim(),vapidKey=getEl("vapidKey").value.trim(),app&&t(app).then(function(){}).catch(function(e){showError(e,"appStatus",appStatusTmo)});try{app=e(firebaseConfig),messaging=n(app),""!=vapidKey?getRegistrationToken():showError("Please specify the public VAPID key.","appStatus",appStatusTmo),onMsgCallback||(onMsgCallback=!0,i(messaging,e=>{showMessage("New foreground message received!.","#008c00","receiveStatus",receiveStatusTmo),appendMessage(e,"foreground","#27960e")}),navigator.serviceWorker.addEventListener("message",e=>{e.data.type&&(showMessage("New background message received!.","#008c00","receiveStatus",receiveStatusTmo),appendMessage(e.data.payload,e.data.type,"#9c19eb"))}))}catch(a){showError(a,"appStatus",appStatusTmo)}}function getRegistrationToken(){o(messaging,{vapidKey}).then(e=>{e?(getEl("iidToken").value=e,getEl("iidToken").style.backgroundColor="#139a3b",getEl("receiveHeader").innerText="Received Message",showMessage("The app was successfully initialized and the registration token is applied.","#008c00","appStatus",appStatusTmo)):showError("No registration token available. Request permission to generate one.","appStatus",appStatusTmo)}).catch(e=>{showError(e,"appStatus",appStatusTmo)})}function deleteRegistrationTokenFromFirebase(){o(messaging).then(e=>{s(messaging).then(()=>{getEl("receiveHeader").innerHTML="Uninitialized",showMessage("Successfully deleted token.","#008c00","appStatus",appStatusTmo),getEl("iidToken").value="",getEl("iidToken").style.backgroundColor="#c2cad1"}).catch(e=>{showError("Unable to delete token.","appStatus",appStatusTmo)})}).catch(e=>{showError(e,"appStatus",appStatusTmo)})}function requestNotificationPermission(){showMessage("Requesting permission...","#a10fae","appStatus",appStatusTmo);var e="<span style='color:red;'>Notification Permission Blocked</span>";permissionTmo&&clearTimeout(permissionTmo),permissionTmo=setTimeout(function(){var t="<div style='color:red;'>Unable to get the browser notification permission for this site";"file:"==window.location.protocol&&(t+=" via file protocol. ",t+="Nevigate this page via http protocol, and change the browser settings to allow notification"),t+=".</div>",getEl("appStatus").innerHTML=t,getEl("receiveHeader").innerHTML=e},5e3),Notification.requestPermission().then(t=>{"granted"===t?(clearTimeout(permissionTmo),showMessage("Notification permission granted.","#008c00","appStatus",appStatusTmo),initializeFCM()):(getEl("receiveHeader").innerHTML=e,showError("Unable to get the browser notification permission for this site.<br/>Please change the browser settings to allow notification.","appStatus",appStatusTmo))}).catch(t=>{getEl("receiveHeader").innerHTML=e,showError(t,"appStatus",appStatusTmo)})}function getSWFileContent(){var e="importScripts('https://www.gstatic.com/firebasejs/9.2.0/firebase-app-compat.js');\n";return e+="importScripts('https://www.gstatic.com/firebasejs/9.2.0/firebase-messaging-compat.js');\n\n",e+="firebase.initializeApp({apiKey: '",e+=getEl("apiKey").value,e+="',projectId:'",e+=getEl("projectId").value,e+="',messagingSenderId:'",e+=getEl("senderId").value,e+="',appId:'",e+=getEl("appId").value,e+="'});\n\nconst messaging = firebase.messaging();\n\n",e+="function postMessage(payload) {\n",e+="self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then(all => all.forEach(client => {\n",e+="var data = { payload: payload, type: 'background' };\n",e+="client.postMessage(data);\n",e+=" }));\n}\n\n",e+="messaging.onBackgroundMessage(function (payload) {\n\n",e+="postMessage(payload);\n\n});"}function getSwFile(){download("firebase-messaging-sw.js",getSWFileContent()),showMessage("Successfully downloaded the service worker javascript file.","#008c00","appStatus",appStatusTmo)}function copySwFile(){navigator.clipboard.writeText(getSWFileContent()),showMessage("Successfully copied the service worker javascript content to clipboard.","#008c00","appStatus",appStatusTmo)}function download(e,t){var a=document.createElement("a");a.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),a.setAttribute("download",e),a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)}function addEvent(e,t,a,s){var n=getEl(e);n.addEventListener(t,a,!1),s&&(n.param=s)}function saveConfig(e){localStorage[e.currentTarget.param]=e.currentTarget.value.trim()}function loadConfig(e){void 0!=localStorage[e]&&(getEl(e).value=localStorage[e].trim())}function setForm(e){loadConfig("apiKey"),loadConfig("clientEmail"),loadConfig("privateKey"),loadConfig("projectId"),loadConfig("senderId"),loadConfig("appId"),loadConfig("vapidKey"),loadConfig("msgPayload")}function showError(e,t,a){try{var s=JSON.parse(e);showMessage(s.error.message,"red",t,a)}catch(n){showMessage(e,"red",t,a)}}function showMessage(e,t,a,s){s&&clearTimeout(s),addChild(a,e="<span style='color:"+t+";'>"+e+"</span>"),s=setTimeout(hideMessage,5e3,a,s,5e3)}function hideMessage(e,t,a){removeChild(e),t&&clearTimeout(t),t=setTimeout(hideMessage,e,t,a)}function addChild(e,t){var a=document.createElement("div");a.innerHTML=t,getEl(e).appendChild(a)}function removeChild(e){let t=getEl(e);t&&t.childElementCount>0&&t.removeChild(t.firstElementChild),"messages"==e&&t&&0==t.childElementCount&&(getEl("clearMsgBtn").style.display="none")}function copyToken(){navigator.clipboard.writeText(getEl("iidToken").value)}function appendMessage(e,t,a){let s=document.querySelector("#messages"),n=document.createElement("div"),o=document.createElement("span"),i=document.createElement("pre");i.style.overflowX="hidden;";var r=new Date;o.textContent="Received "+t+" message ("+r.toLocaleString()+"):",o.style.color=a,i.textContent=JSON.stringify(e,null,2),i.style.color=a,n.appendChild(o),n.appendChild(i),s.appendChild(n),getEl("clearMsgBtn").style.display="inline-block",clearTimeout(receiveMsgTmo),receiveMsgTmo=setTimeout(hideMessage,12e4,"messages",receiveMsgTmo,12e4)}function clearMessages(e){e.currentTarget.style.display="none";let t=document.querySelector("#messages");for(;t.hasChildNodes();)t.removeChild(t.lastChild)}function asyncHttpRequest(e,t,a,s,n){var o=new XMLHttpRequest;if(o.addEventListener("error",function(e){a("An error occurred while sending the request.",o.status)}),o.onreadystatechange=function(){4===o.readyState&&a(o.responseText,o.status)},o.open(e,t,!0),s)for(let i in s)o.setRequestHeader(i,s[i]);o.send(n)}function msgSend(e){if(""==accessToken||tokenTime+348e4<Date.now()){tokenTime=Date.now();var t=getEl("clientEmail").value,a=getEl("privateKey").value,s="https://oauth2.googleapis.com/token",s="https://oauth2.googleapis.com/token",n=JSON.stringify({email:t,privateKey:a,aud:s,scope:"https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/datastore https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/firebase.database https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/iam",uid:"",claims:""}),o=-1==curPage.indexOf(".php")?curPage.replace(".html",".php"):curPage;asyncHttpRequest("POST",o,function(e,t){if(e){if(200!=t)showError(404!=t?e:"Unable to locate "+o+". Plese put "+o+" in the same directory with this "+curPage+".","sendStatus",sendStatusTmo);else{var a=JSON.parse(e);"failure"==a.status?showError(a.msg,"sendStatus",sendStatusTmo):sendFCMMessage(accessToken=a.token)}}else 0!=t&&showError("The "+o+" was unable to process the HTTP request or not responding.","sendStatus",sendStatusTmo)},{"Content-Type":"application/json"},n)}else sendFCMMessage(accessToken)}function sendFCMMessage(e){var t=getEl("projectId").value,a=getEl("msgPayload").value;asyncHttpRequest("POST","https://fcm.googleapis.com/v1/projects/"+t+"/messages:send",function(e,t){200!=t?showError(e,"sendStatus",sendStatusTmo):showMessage("Successfully sent message.<br/>"+e,"#008c00","sendStatus",sendStatusTmo)},{Authorization:"Bearer "+e},a)}function loadSampleMsg(e){var t=getEl("iidToken").value;""==t&&(t="APP_REGISTRATION_TOKEN");var a='{\n "message": {\n "notification": {\n';a+=' "title": "Hello from FCM web app",\n "body": "FCM notification works",\n',a+=' "image": "https://www.gstatic.com/mobilesdk/240501_mobilesdk/firebase_28dp.png"\n',a+=' },\n "android": {\n "priority": "HIGH",\n "notification": {\n',a+=' "notification_priority": "PRIORITY_HIGH"\n }\n },\n "webpush": {\n',a+=' "fcm_options": {\n "link": "https://google.com"\n }\n },\n',a+=' "token": "'+t+'"\n',a+=" }\n}",getEl("msgPayload").value=a}function openTab(e){var t,a,s;for(t=0,a=document.getElementsByClassName("tabcontent");t<a.length;t++)a[t].style.display="none";for(t=0,s=document.getElementsByClassName("tablinks");t<s.length;t++)s[t].className=s[t].className.replace(" active","");getEl(e.currentTarget.param).style.display="block",e.currentTarget.className+=" active"}function docReady(e){"complete"===document.readyState||"interactive"===document.readyState?setTimeout(e,1):document.addEventListener("DOMContentLoaded",e)}docReady(function(){addEvent("initializeBtn","click",requestNotificationPermission),addEvent("deleteTokenBtn","click",deleteRegistrationTokenFromFirebase),addEvent("apiKey","change",saveConfig,"apiKey"),addEvent("clientEmail","change",saveConfig,"clientEmail"),addEvent("privateKey","change",saveConfig,"privateKey"),addEvent("projectId","change",saveConfig,"projectId"),addEvent("senderId","change",saveConfig,"senderId"),addEvent("appId","change",saveConfig,"appId"),addEvent("vapidKey","change",saveConfig,"vapidKey"),addEvent("msgPayload","change",saveConfig,"msgPayload"),addEvent("tokenCopyBtn","click",copyToken),addEvent("getSwBtn","click",getSwFile),addEvent("copySwBtn","click",copySwFile),addEvent("clearMsgBtn","click",clearMessages),addEvent("msgSendBtn","click",msgSend),addEvent("loadMsgBtn","click",loadSampleMsg),addEvent("instructionTabBtn","click",openTab,"instructionTab"),addEvent("setupTabBtn","click",openTab,"setupTab"),addEvent("receiveTabBtn","click",openTab,"receiveTab"),addEvent("composeTabBtn","click",openTab,"composeTab"),setForm(),getEl("url1").innerHTML=curPage.indexOf(".php")>-1?"<b>"+curPage+"</b> and <b>"+curPage.replace(".php",".html")+"</b>":"<b>"+curPage+"</b> and <b>"+curPage.replace(".html",".php")+"</b>",getEl("url2").innerHTML=curPage,getEl("instructionTabBtn").click()});</script>
</body>
</html>