Push.jsを使ってサイトに10分でブラウザプッシュ通知を導入する

最近、仕事でWebサービスにブラウザプッシュを導入することになり、まずは効果検証のために、最小限のプッシュ通知を導入してみようということになりました。

ユーザーデータを送ってセグメントプッシュができるサービスなど多機能なものは探せばいろいろと出てきますが、まずはサクッとブラウザプッシュを試したかったので、今回はさくっと実装できそうなPush.jsを使用することにしました。

この記事では**普段はHTML / CSS しか触らない人でも理解できる**ように説明していきますので、わかる人にとっては冗長に感じるかもしれないので、そのような人は[公式サイト](https://pushjs.org/)をご覧ください。

### この記事で説明すること

- Push.jsを使った、最小構成のブラウザプッシュ通知が実装の仕方
- プッシュ通知を許諾したか、拒否したかの効果測定の仕方

### この記事で説明しないこと

- ユーザーデータに基づいたセグメント配信など高度なブラウザプッシュ通知

=> 個人的には100%freeな[One Signal](https://onesignal.com/)がおすすめです。
<img width="699" alt="スクリーンショット 2018-07-27 14.45.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/251765/ec55653d-8878-cdba-2cc5-e264843f9ea5.png">

## 実装手順
### ライブラリの読み込み

Push.jsはブラウザプッシュ通知を送るために必要なNotification APIを簡単に使えるようにしたライブラリです。

まず今回使用する[Push.js](https://pushjs.org/)を読み込みましょう。
今回は楽をしたいので、CDNを使用します。

検索してみると、執筆した2018.7.28では最新版の1.0.7がありますので、これを使用します。
https://cdnjs.com/libraries/push.js

```index.html
<html>
<head>
	<title>Push.js Sample</title>
</head>
<body>

<h1>Push.js Sample</h1>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/push.js/1.0.7/push.min.js"></script>
</body>
</html>
```

### 必要なメソッドの呼び出し

```index.html
<script type="text/javascript">
	Push.create('Push 通知だよ！');
</script>
```

なんと、これだけです!

このHTMLにアクセスすると以下のようなプッシュ通知を送ってもいいかの許諾を求めるポップアップが表示されます。

（追記：下の画像はFireboxでの動作確認です。Chromeは許諾が表示されなくなってしまったので、もしかすると、最近のSSL対応の影響かもしれないです。）


<img width="376" alt="スクリーンショット 2018-07-27 14.33.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/251765/9f93f5f6-e4cb-9265-a15a-85625ac1960e.png">

通知を許可すると、このようにぴょこっとブラウザプッシュ通知が表示されます。
<img width="367" alt="スクリーンショット 2018-07-27 14.33.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/251765/8e9b546f-2c0d-0db4-8e01-a651d56e93d1.png">

実際はもう少しいろいろオプションを設定することになると思います。

```index.html
<script type="text/javascript">
	Push.create("Push 通知だよ！", {
		body: "本文だよここに表示されるよ",
		icon: './images/icon.png', // 右側に表示される画像のパス
		timeout: 4000,
		onClick: function () {
			location.href = 'https://yahoo.co.jp';
			this.close();
		}
	});
</script>
```

<img width="364" alt="スクリーンショット 2018-07-27 14.39.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/251765/d59ed7bd-192a-b83e-271c-bb43782078ed.png">

コードと画像を見比べれば、対応関係はわかるかと思います。
`onClick`を使って、ユーザーがクリックしたときの処理を書くことができます。
この例では、ヤフートップページに遷移するようにしています。

例えば、トップページにアクセスしたときに、最新の記事に遷移するプッシュ通知を出すとかに使えますね。

## 効果測定の仕方について

はい、ちゃんと効果測定しましょう。

```js:index.html
Push.Permission.request(onGranted, onDenied);

function onGranted() {
	console.log('Granted!');
}

function onDenied() {
	console.log('Denied...');
}
```

`Push.Permission.request`によって許諾確認のポップアップを表示します。
このメソッドの第一引数に許諾時のコールバック、第二引数に拒否時のコールバックを指定することができます。

この記事では詳しくは触れませんが、Google Analyticsを使っている方がほとんどかと思うので、イベントトラックキングをするといいかと思います。

https://developers.google.com/analytics/devguides/collection/analyticsjs/events?hl=ja

例えばこんな感じでいいかと思います。

```js:index.html
function onDenied() {
	ga('send', 'event', 'browser-push', 'denied', 'top', 1);
}
```

## ブラウザの対応状況は？

公式サイトによると、

> the Notification API allows modern browsers such as Chrome, Safari, Firefox, and IE 9+ to push notifications to a user’s desktop

とのことで、Chrome, Safari, Firefox, そしてIE9以上の**デスクトップ**ブラウザで使用できます。
なおEdgeに関しては、動作確認できているのと、Notification APIは対応しているので、問題なく動作するかと思います。

https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/windows-integration/web-notifications-api

## ページに30秒以上滞在しているユーザーにだけ許諾ポップアップを表示する

便利なブラウザプッシュ通知ですが、いきなり初めて訪問したサイトからプッシュ通知の許諾が表示されると、ちょっと怪しい...と思う人も少なくないかと思います。

**渋谷を歩いている知らない人にいきなりLINE教えて？っていうようなもん**ですよね。

せっかくなので、少し仲良くなってから許諾を求めるようにすれば許諾率は上がるのではないでしょうか？
ということで、30秒以上ページをみているユーザーにだけ表示するサンプルコードをおいておきます。

```index.html
<html>
<head>
	<title>Push.js Sample</title>
</head>
<body>

<h1>Push.js Sample</h1>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/push.js/1.0.7/push.min.js"></script>

<script type="text/javascript">
	setTimeout(function () {
		Push.Permission.request(onGranted, onDenied);
	}, 30 * 1000);

	function onGranted() {
		console.log('Granted!');
	}

	function onDenied() {
		ga('send', 'event', 'browser-push', 'denied', 'top', 1);
	}

	if (Push.Permission.has()) {
		Push.create("Push Notification title here", {
			body:    "Body text here",
			icon:    './images/icon.png', // Image path displayed right side
			timeout: 4000,
			onClick: function () {
				location.href = 'https://yahoo.co.jp'
				this.close();
			}
		});
	}

</script>
</body>
</html>

```

## まとめ　

ブラウザプッシュがここまで簡単に導入できると思っていなかったので、気になっているけどなんだか難しそうだからと避けていた人はぜひまずは導入みてくださいー！