当初の懸念どおりブラウザのプッシュ通知は邪悪に使われはじめている。実装側はクリックまで購読確認を待つべき。

追記: 2019/11/12

2年経ったけど体験が悪化し続けた結果、 Firefox がこの記事の通りになりましたね…

www.fxsitecompat.dev


プッシュ通知、ネイティブアプリの機能郡をWebに持ち込むPWA技術の売りの一つだが、当初から懸念されていたとおり、非常にノイジーなものとなってしまっている。自分も気づけばあらゆるサイトの購読確認を、無意識で拒否を押すようになってしまった。

hagex.hatenadiary.jp

少し前の記事。最近はどこかで wordpressプラグインになったのか、目にする機会が非常に多くなり、非常にストレスフル。最初は技術的な目新しさからか、ある程度容認していたが、さすがにこの状況が悪化する一方で、本気でやばいんじゃないかと思っている。とくに初見のブログの記事を読む前に、購読確認が出るのが最悪の体験となっている。

そもそもプッシュ配信とはそういうものであり、運営側はグロースハックの名目で何が何でもユーザのリテンションを獲得しようとしてくる。と考えるとプッシュ機能は性善説に立って設計して良いものではない。最近はユーザーの認知もある程度キャズムを越えたのか、悪評ばかりが集まるようになっている。また Chrome側の通知管理UIもよくわからないところにある。

実装の話

どこもかしこもこんな風に初期化時に購読を求めにいく。

const serviceWorkerRegistration = await navigator.serviceWorker.ready
const subscription = await serviceWorkerRegistration.pushManager.getSubscription() // ここで確認モーダルが出る

自分が言いたいのは、要はなにかしらのボタンをクリックして初めてモーダルを出してくれという話

document.querySelector('.subscription-button').addEventListener('click', async ev => {
  const serviceWorkerRegistration = await navigator.serviceWorker.ready
  const subscription = await serviceWorkerRegistration.pushManager.getSubscription()
  // ...
})

Googleの人やWeb標準に人にいいたいのは、そもそも仕様レベルでクリックをイベントのルートに持たないと購読できない、としたほうが良いのではないか。すでにそういう実装になってるAPIとして Fullscreen APIがある。

https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Using_full_screen_mode

忖度

この機能の背景として、Webの相対的な立場の低下を踏まえ、モバイルアプリを倒すために今現在モバイルアプリが(提供側が)一番好んでいるであろうプッシュ通知をブラウザ側にもってきて、モバイルの体験をWebにもってきたい、というのはよくわかるが、ここでユーザーの体験のことは無視されがちだ。ちゃんと機能すれば良いもの、という言い訳もわかる。が、現状最悪な方向に向かっている。

この状況が続くと、2003年ごろjsをみんなオフにしていたように、ユーザー間でServiceWorker をオフにすることを推奨されたり、PWAというブランディングそのものを毀損してしまう恐れがある。

追記

Google の アドボケーターの agektmr さん曰く