Webブラウザからの「通知」(Notification)
はじめに
Chrome拡張の通知機能を調べていたのですが、その過程でWebの標準として「通知」があることを知りました。
http://www.w3.org/TR/2013/WD-notifications-20130912/
そこで、Web標準の「通知」機能をひと通り動かしてみました。
動かせるサンプルは以下に置いています。
GitHubにも置いてあります(https://github.com/kuwalab/WebStandard)
通知はブラウザ「外」に行うため、ブラウザ側ではそのサイトから通知を受けることを許可しないと通知ができません。
サンプルでも2つボタンがあり「通知の許可」ボタンを押すことでユーザーに通知の許可を求めます(画面はChrome)。
許可をすると、「通知」ボタンで通知が表示されます。
通知を許可したサイトは、設定から確認・削除できます。
コードは以下のとおりです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>通知のテスト</title> <style> input { background-color: #0000ff; color: #ffffff; border-radius: 5px; padding: 5px; border: none; outline: 0; } input:hover { cursor: pointer; } input:active { cursor: pointer; background-color: #000099; } </style> </head> <body> <input type="button" id="request" value="通知の許可"><br> <input type="button" id="fire" value="通知!!"> <script> // 参考 https://developer.mozilla.org/ja/docs/Web/API/notification (function() { if (!window.Notification) { // Notificationがなければ無視 return; } var permission = 'denied'; document.getElementById('request').addEventListener('click', function() { // permissionを要求する。pは要求の結果 // Notificaton.permissionはFirefox 24にはあるが、Chrome 30にはない // 現状では、requestPermissionのコールバックの引数でパーミッションを取得する Notification.requestPermission(function(selectedPermission) { permission = selectedPermission; }); }); document.getElementById('fire').addEventListener('click', function() { if (permission !== 'granted') { console.log('not allow'); return; } var notify = new Notification('通知のタイトル', { tag: 'tag', body: '通知の本文', icon: 'icon.png' }); // クリックでWebページを開く notify.addEventListener('click', function() { open('https://github.com/kuwalab/WebStandard'); }); // 5秒経過で消す。 setTimeout(function() { notify.close(); }, 5000); }); })(); </script> </body> </html>
まず、通知の要求についてですが、Notification.requestPermissionで要求とその結果の取得をします。
Notification.requestPermission(function(selectedPermission) { permission = selectedPermission; });
requestPermissionメソッドの引数はコールバック関数となっていて、そのコールバック関数の引数でパーミッションが取得できます。
仕様的には、Notification.permissionでも取得できそうなのですが、Chrome 30では確認できませんでした。Notification.permissionはFirefoxでは取得できます。
実際の通知は以下の部分です。
var notify = new Notification('通知のタイトル', { tag: 'tag', body: '通知の本文', icon: 'icon.png' });
引数でインスタンスを受けているのは後で通知をクローズするためです。自動でクローズしないのであれば必要ありません。
通知は、非常にシンプルな作りで基本的には文字だけです。引数にアイコンを1つだけとることができます。また、例にあるようにクリックした際のイベントを設定できます。