SlideShare a Scribd company logo
1 of 22
W3C Push の話
@shintaro tamaki
はじめに
本発表は、W3C Push APIを使用した、Push通知についてお話します。
2016年3月に私が実装した経験がもとになってます。
当時は今と比べて対応しているブラウザも少なく、
Amazon SNS、Firebase JavaScript SDKのような実装を簡単にしてくれる
ツールも対応してませんでした。
その際の苦労話も含め発表することで、
今後Push APIを使おうと検討されている方々の参考になれば幸いです。
ごあいさつ
● 玉木 信太郎
● 株式会社 ぐるなび
● twitter:@tamaki_shintaro
● github:ShintaroTamaki
アイコンの由来
前職で使っていたアカウントのアイコンが猫でした、個人のアカウントと区別するため、犬のアイコンに
したところ、こっちのアイコンが目立つことに・・・
ちなみに猫派です
アジェンダ
● はじめに
● W3C Push とは
● W3C Push の仕組み
● ServiceWorkerとは
● 使えるブラウザ
● 実装するには
● 実装あるある
● 実装してみた感想
W3C Push とは
● ブラウザで実現できるPush通知
● JavascriptとHTTP通信が行える言語(curlコマンドでもOK)であれば実装で
きます
Webページ
W3C Push の仕組み
Webページにアクセスした際に、ServiceWrokerの登録を行う。
その際、GCM等で使うIDが発行されるので、発行されたIDを使ってGCMにリクエストを送ると、PC、
スマホのブラウザにPush通知が送信できます。
ServiceWorker.js
ID
GCM等
Push通知
登録
アクセス
ServiceWorkerとは ①
Service Worker の紹介
Service Worker はブラウザが Web ページとは別にバックグラウンドで実行するスクリプトで、Web ペ
ージやユーザのインタラクションを必要としない機能を Web にもたらします。すでに現在、プッシュ通
知やバックグラウンド同期が提供されています。さらに将来は定期的な同期、ジオフェンシングなども
導入されるでしょう。このチュートリアルで説明する機能は、ネットワークリクエストへの介入や処理
機能と、レスポンスをプログラムから操作できるキャッシュ機能です。
ServiceWorkerとは ②
続き
● Service Worker は JavaScript Worker のひとつです。ですので DOM に直接アクセスできません。
Service Worker がコントロールするページとの通信は postMessage インターフェースから送られ
るメッセージに返信することで行えます。DOM を操作したい場合は、コントロールするページ経
由で行えます。
● Service Worker はプログラム可能なネットワークプロキシです。ページからのネットワークリクエ
ストをコントロールできます。
● Service Worker は使用されていない間は終了され、必要な時になったら起動します。ですので
onfetch、onmessage ハンドラ内でグローバルに設定したステートに依存できません。持続的で再
利用可能な情報を Service Worker のライフサイクル間で共有したい場合は、IndexedDB API API
にアクセスしなければいけません。
● Service Worker は JavaScript の Promises を多用します。Promises についてよく知らない方はこ
の記事を読むのをいったん止めて、Jake Archibaldの記事を読みましょう。
使えるブラウザ
caniuseで確認できます。
http://caniuse.com/#search=service%20workers
実装するには
下記作業が必要となります・・・よね?
● 構成・アーキテクチャの検討
● 必要な機能の設計
Webページ
実装するには(構成・アーキテクチャ)
サービスとして提供するには下記が必要でした。
・通知したいタイミングで、Push通知を送信するバッチ
・IDを管理するDatabase、テーブル
・ServiceWorker登録時に発行されるIDをDatabaseに保管するJavascriptのリクエストと受信用API
ServiceWorker.js
GCM等
Push通知
登録
API
DB
バッチ
実装時の問題点
● 対応していないブラウザで
ServiceWorkerを登録しようとするとエラーに
当たり前ですが、JavascriptのCall順番によっては後続が動かないことになり
ます。
例:GoogleAnalyticsの計測とか
そのため、ServiceWorkerが使えることを確認して登録することが必要
チェック用のファンクションがあるので、それをCallしてください。
実装時の問題点
● PushAPIも対応していないブラウザでエラーになる
2016年2月の時点は
ServiceWerkerが使えるブラウザ=Push APIが使えるブラウザ
ではなかった
caniuseで確認しましょう
● ServiceWorker
http://caniuse.com/#search=service%20workers
● Push API
http://caniuse.com/#search=Push%20API
実装時の問題点
● Opera問題
JavascriptでPush APIの機能を持っているか確認できるはずでしたが、正し
く応答を返さず、泣く泣くUserAgentで判定することになりました。
※ 現在はOperaもPushAPIが利用できるので、判定の必要はありません。
実装時の問題点
● Push通知サーバーの問題
ブラウザごとにPush通知用のサーバーが異なるため、ブラウザの情報もテー
ブルに登録する必要があり、UserAgentを登録することにしました。
バッチでUserAgentを判断し、ブラウザのバージョンも判定し処理を分けて
ました。
実装時の問題点
● ペイロードが指定できない
Push通知のペイロードにメッセージ等を入れて自由に文言を設定したかった
のですが、ちょうどChrome 49の時にリリースしたため、対応できてません
でした。
・・・でも、ディレクターの要望によりやりたいと・・・
なので最終的な構成は次のスライドのようになります
Webページ
実装時の問題点
要望をかなえるため下記機能を追加しました
・Push通知を受信した場合、特定のAPIをCallしメッセージを取得する
・Push送信をする際に、メッセージをRedisに保存する
ServiceWorker.js
GCM等
Push通知
登録
API
DB
バッチ
API Redis
Push通知
実装時の問題点
● ServiceWorkerからAPIへアクセスする
JQueryでなんとかなるだろうと思ってました。
が、ふたを開けてみると、JQueryってDOM(document.)使うんですよね~
いろいろ調べてServiceWorkerのFetch APIを使うことでリクエストできるよ
うになりましたが、さらなる問題が・・・
実装時の問題点
● 環境問題
当時は下記3環境がありました、環境毎にFetch APIのリクエスト先ドメイン
を変える必要がありました。
○ localhost
○ ステージング
○ 本番
ServiceWorkerは登録されたらアップデートしないと更新できないので、登
録時にドメインをセットしておかなければいけません。とはいえ、3環境の
ドメインを用意したServiceWorker.jsを用意するのも今後のメンテナンス性
に問題があるので、ドメイン部分を置換してリリースする仕組みを作成して
実装時の問題点
● 謎のCPU100%
ServiceWorkerのテスト中に謎のファンが高速に、後でプログラムミスだと
は分かったのですが、ブラウザが動かないので、まずブラウザを閉じてから
解析をすることに
※ この問題簡単にデバッグできないじゃん・・・
実装してみた感想
● 仕様的な問題もあり、意外と工数がかかった
当初見積もり3週間程度、実際は1.5か月程度
→ 初ものは何かと問題が多いです、バッファをしっかりと
● ServiceWorkerはChromeのディベロッパーツールでデバッグできたので実装
の間違いに気づきやすかった
→ Breakとコンソールログ重要
● DOM(document)を使わないJavascriptが新鮮なのでちょくちょくミスする
→ ServiceWorkerとブラウザのJSで頭の切り替えが必要です
一緒に働いてくれるエンジニア募集中
https://corporate.gnavi.co.jp/recruit/career/

More Related Content

What's hot

【Instagram活用セミナー資料】Instagram x ネットショップの可能性
【Instagram活用セミナー資料】Instagram x ネットショップの可能性【Instagram活用セミナー資料】Instagram x ネットショップの可能性
【Instagram活用セミナー資料】Instagram x ネットショップの可能性Yuriko Kai
 
機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -
機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -
機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -Masakazu Ishihata
 
Twitterクライアントがこの先生き残るには #twtr_hack
Twitterクライアントがこの先生き残るには #twtr_hackTwitterクライアントがこの先生き残るには #twtr_hack
Twitterクライアントがこの先生き残るには #twtr_hackShinichi Sasaki
 
groongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコム
groongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコムgroongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコム
groongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコムWalbrix Group
 
ビッグデータを活用したSEO対策:検索エンジン最適化とは
ビッグデータを活用したSEO対策:検索エンジン最適化とはビッグデータを活用したSEO対策:検索エンジン最適化とは
ビッグデータを活用したSEO対策:検索エンジン最適化とは新潟コンサルタント横田秀珠
 
Googleが恐れるハッシュタグに関する歴史とニュースまとめ
Googleが恐れるハッシュタグに関する歴史とニュースまとめGoogleが恐れるハッシュタグに関する歴史とニュースまとめ
Googleが恐れるハッシュタグに関する歴史とニュースまとめ新潟コンサルタント横田秀珠
 
情報リテラシー論 授業資料3
情報リテラシー論 授業資料3情報リテラシー論 授業資料3
情報リテラシー論 授業資料3uchida nagaoka
 

What's hot (8)

【Instagram活用セミナー資料】Instagram x ネットショップの可能性
【Instagram活用セミナー資料】Instagram x ネットショップの可能性【Instagram活用セミナー資料】Instagram x ネットショップの可能性
【Instagram活用セミナー資料】Instagram x ネットショップの可能性
 
機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -
機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -
機械学習でお小遣いを稼ぐ! - 本推薦 Twitter bot の紹介 -
 
Twitterクライアントがこの先生き残るには #twtr_hack
Twitterクライアントがこの先生き残るには #twtr_hackTwitterクライアントがこの先生き残るには #twtr_hack
Twitterクライアントがこの先生き残るには #twtr_hack
 
groongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコム
groongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコムgroongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコム
groongaとScalaとPythonで作る Twitter検索 - ヒウィッヒ・ドットコム
 
ビッグデータを活用したSEO対策:検索エンジン最適化とは
ビッグデータを活用したSEO対策:検索エンジン最適化とはビッグデータを活用したSEO対策:検索エンジン最適化とは
ビッグデータを活用したSEO対策:検索エンジン最適化とは
 
Googleが恐れるハッシュタグに関する歴史とニュースまとめ
Googleが恐れるハッシュタグに関する歴史とニュースまとめGoogleが恐れるハッシュタグに関する歴史とニュースまとめ
Googleが恐れるハッシュタグに関する歴史とニュースまとめ
 
情報リテラシー論 授業資料3
情報リテラシー論 授業資料3情報リテラシー論 授業資料3
情報リテラシー論 授業資料3
 
小松De朝活231
小松De朝活231小松De朝活231
小松De朝活231
 

Similar to W3C Push の話

悩めるひとり情シスを救うChatwork API活用方法
悩めるひとり情シスを救うChatwork API活用方法悩めるひとり情シスを救うChatwork API活用方法
悩めるひとり情シスを救うChatwork API活用方法Mami Sakaguchi
 
今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント
今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント
今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハントHiroyuki Ishikawa
 
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみたTensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみたVan Huy
 
APIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpAPIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpTakeshi Komiya
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察Fumiya Sakai
 
アニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみた
アニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみたアニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみた
アニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみたYoshitake Takata
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップFumiya Sakai
 
スグにできる!Microsoft Flow でこんな連携あんな連携
スグにできる!Microsoft Flow でこんな連携あんな連携スグにできる!Microsoft Flow でこんな連携あんな連携
スグにできる!Microsoft Flow でこんな連携あんな連携Hirofumi Ota
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめできるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめFumiya Sakai
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)Fumiya Sakai
 
#Net2tokyo_socialgood_tool_share_meetup
#Net2tokyo_socialgood_tool_share_meetup#Net2tokyo_socialgood_tool_share_meetup
#Net2tokyo_socialgood_tool_share_meetup孝弘 笠原
 
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメTokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメTsubasa Yoshino
 
Device WebAPI 20160407
Device WebAPI 20160407Device WebAPI 20160407
Device WebAPI 20160407陽平 山口
 
20200129 cogbot lt
20200129 cogbot lt20200129 cogbot lt
20200129 cogbot ltyohoshino
 
Google LighthouseのPWA項目で満点をトル!
Google LighthouseのPWA項目で満点をトル!Google LighthouseのPWA項目で満点をトル!
Google LighthouseのPWA項目で満点をトル! 2nose
 
Aws io tで証明書を自動登録してデータをアップするまでのお話し
Aws io tで証明書を自動登録してデータをアップするまでのお話しAws io tで証明書を自動登録してデータをアップするまでのお話し
Aws io tで証明書を自動登録してデータをアップするまでのお話しYuji Chino
 
エンジニアになり1ヶ月が経って!
エンジニアになり1ヶ月が経って!エンジニアになり1ヶ月が経って!
エンジニアになり1ヶ月が経って!ssuserccd9f1
 
APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...
APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...
APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...pandeiro245
 

Similar to W3C Push の話 (20)

悩めるひとり情シスを救うChatwork API活用方法
悩めるひとり情シスを救うChatwork API活用方法悩めるひとり情シスを救うChatwork API活用方法
悩めるひとり情シスを救うChatwork API活用方法
 
今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント
今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント
今だからこそ知りたい!オープンソース時代に生きるクリエイターとコミュニティとビジネス(クリエイティブハント) #ゴーハント
 
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみたTensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
 
APIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpAPIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjp
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察
 
アニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみた
アニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみたアニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみた
アニメの公式アカウントのフォロワー数をつぶやくTwitterボットを作ってみた
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップ
 
スグにできる!Microsoft Flow でこんな連携あんな連携
スグにできる!Microsoft Flow でこんな連携あんな連携スグにできる!Microsoft Flow でこんな連携あんな連携
スグにできる!Microsoft Flow でこんな連携あんな連携
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめできるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
 
#Net2tokyo_socialgood_tool_share_meetup
#Net2tokyo_socialgood_tool_share_meetup#Net2tokyo_socialgood_tool_share_meetup
#Net2tokyo_socialgood_tool_share_meetup
 
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメTokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
 
Device WebAPI 20160407
Device WebAPI 20160407Device WebAPI 20160407
Device WebAPI 20160407
 
20200129 cogbot lt
20200129 cogbot lt20200129 cogbot lt
20200129 cogbot lt
 
Google LighthouseのPWA項目で満点をトル!
Google LighthouseのPWA項目で満点をトル!Google LighthouseのPWA項目で満点をトル!
Google LighthouseのPWA項目で満点をトル!
 
Aws io tで証明書を自動登録してデータをアップするまでのお話し
Aws io tで証明書を自動登録してデータをアップするまでのお話しAws io tで証明書を自動登録してデータをアップするまでのお話し
Aws io tで証明書を自動登録してデータをアップするまでのお話し
 
エンジニアになり1ヶ月が経って!
エンジニアになり1ヶ月が経って!エンジニアになり1ヶ月が経って!
エンジニアになり1ヶ月が経って!
 
概説 Data API v3
概説 Data API v3概説 Data API v3
概説 Data API v3
 
APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...
APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...
APIを提供するあらゆるサービスの データをkintoneと同期する RubyGemを作ってソース公開した話 (コミッター募集) 2016 01-22 k...
 
CTOが語るUI/UX
CTOが語るUI/UXCTOが語るUI/UX
CTOが語るUI/UX
 

W3C Push の話