ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Safari用のWebプッシュについて
Webプッシュを使って、macOS上のSafariでWebサイトやWeb Appに優れた通知機能を取り込みます。Push API、Notifications API、Service WorkersをWeb標準ベースで組み合わせて、通知をユーザにリモート送信する方法を紹介します。
リソース
- Learn more about bug reporting
- Notifications API
- Push API
- Sending web push notifications in web apps and browsers
- Service Worker API
関連ビデオ
WWDC23
WWDC22
-
ダウンロード
♪♪
こんにちは Brady Eidsonです WebKit Architecture チームのエンジニアです SafariのWebプッシュを ご紹介します Webプッシュで ウェブAppのユーザーに リモートで通知を 送信できます ここではwebkit.orgからの 通知が 画面の右上に 表示されています 通知のクリックで新規 ブログ投稿が開きます これがどう機能するかの 詳細に入る前に 多く寄せられた質問に お答えたいと思います
WebプッシュはVentura以降の Mac Safariでサポートされ 来年にはiOSとiPadOSにも 導入されます
Safariプッシュ通知は Mac Safari ユーザーにリーチするための オプションに長い間 なっていました 引き続き機能しますが本日 Webプッシュのサポートが 追加されたことを お知らせします まさにWebプッシュなんです! 他のブラウザに実装されて いるものと同じ さまざまな標準の 組み合わせです これらの基準については 後で説明しますが 最も重要なポイントは AppをWeb標準に従い コーディングした場合 Safariで機能させるための 変更は必要はありません ブラウザ検出で Safariを除外すると 事前作業が必要になります ブラウザ検出機能から機能の検出 へと切り替える絶好の機会です それがベスト プラクティスです すべてのMacおよびiOSデバイスに ネイティブのプッシュするのと同じ Apple Push Notification サービスを使用しますが Safariユーザーにリーチするための 開発者アカウントは不要です Webプッシュに新しいエンド ポイントURLがありますが Safariを意図せず除外 している可能性もあります サーバ上のプッシュエンド ポイントを厳密に管理する場合 push.apple.comのサブ ドメインを許可してください こうした質問への回答を 以外にも詳しく 見ていくことにしましょう まずSafariでのWebプッシュ 体験をユーザーの観点から 見てみましょう 次に許可リクエストから通知 センター上のエントリの クリックの処理まで Webプッシュの フロー全体について 最後に既存のWeb Appへの Webプッシュ追加要件を確認します まずSafariの ユーザー体験について これをデモでカバーする 最良の方法は macOS Venturaの Safariです ブラウザタブで開いて いるのはwebkit.org WebKitオープンソース プロジェクトを最新の状態に 保つのにWebプッシュは 優れた方法と言えます webkit.orgではユーザーによる ジェスチャーなしに プッシュの許可を 要求することはありません そこでこのベル型のボタンを クリックして通知を購読します 表示されるのはシステムの 通知プロンプトで 他のAppと 同じものです webkit.orgに 代わって処理されます “許可”をクリックして 準備完了です webkit.orgは投稿と ソースコードへの新しい コミットに関する通知を 提供しています コミットごとに通知を受けると 作業の邪魔になりますが ブログ投稿については 通知を受けたい そこでボックスをチェック 偶然にもWebKitブログ 投稿が 公開されたようです この通知は他の 通知と同様 webkit.orgに帰属します クリックしてアクティブ化すると Safariで開いた ブログが見られます ユーザーがアクセスを 許可すると そのアクセス許可の 制御が維持され macOSユーザーとして 通知設定の管理に 慣れているので webkit.orgの通知を ここで設定します 他のAppやサービスと 同じリッチな設定 Safariユーザーとして サイト設定を 管理することにも 慣れています そこでwebkit.orgの権限を オンまたはオフに Safariユーザー用のWeb プッシュの機能でした 先に進む前にデモで取り 上げた項目を復習します ユーザーの要求しないのに 購読リクエストをして スパムのようになるのは 好ましくありません そこでクリックまたはキー ストロークに応答してのみ プッシュをリクエストする こともできます サイトがユーザーに通知を 表示する権限を取得すると ユーザーはその権限を 制御します Safari設定またはシステム 設定での管理を選択できます 両方で管理する場合 設定は同期されます 最後にさまざまなイベントの 通知を提供する場合 きめ細かく制御することが ベストプラクティスで 他のAppと同様に ウェブApp内の 通知を扱う方が 良いでしょう Webプッシュの動作を 確認したので 各ステップを詳しく 見ていきましょう これに精通してる方も いると思います Webプッシュを初めて 使用する方のために 関連する標準とドキュメントを 参照しながら段階的に説明します ユーザーがタブからサイトに アクセスすることから始まります Safariで開いている webkit.orgです タブなのでService Workerを インストールできます Service Workerは現在 開いているタブとは別に ドメイン全体で動作する JavaScriptのユニットです Service Workerスクリプトが インストールされると ウェブAppはプッシュを リクエストできるようになります 前述のとおりこのリクエストは ユーザージェスチャ駆動であるべきです ベル型のボタンをクリックして webkit.orgが許可を要求 これでユーザージェスチャ駆動の 要件を満たします サイトがプッシュを要求すると ユーザーにこの\ システムプロンプトが 表示されます ここでWebサイトに 付加価値を付けるための 最終決定を紐付けます
ユーザーがリクエストを拒否する 可能性もあります JavaScriptはそれを処理 できる必要があります ユーザーが権限を 付与した場合 PushSubscription オブジェクトを取得 これには サーバが ブラウザでプッシュを 送信するための全てが 含まれます 使用する正確なURL エンドポイントなどの情報です このペイロードはAppに 最適な方法で サーバにコマンドを 返信します 多くの サーバパッケージ には適切なサポートがあり 独自ロールも可能です 同じことが サーバの プッシュメッセージを 送信する方法と タイミングにも関係します タイミングはWebサイト 次第です プッシュの送信が 決定したら 次の処理を準備できます Service Workerは インストールされてますね? サーバがプッシュを送信し Safariが受信すると Service Workerを起動し JavaScript プッシュイベントを送信します 通知センターで ユーザーに通知を表示することは プッシュイベントの 要件となっています プッシュイベント通知を 表示するのは サイトがブラウザタブで 開かれている場合です タブで開いていない場合 にも発生します Ventura上のSafariの場合 Safariが実行中でなくても 発生します 最後のステップはユーザーが 通知をクリックした場合 イベントがService Workerに 送信され 適切に対応できるよう処理し 通知に関連したURLに 新しいウィンドウを開く などの例があります Webプッシュの流れが 理解できたので 詳細を見てみる ことにしますが 既存のWeb Appに Webプッシュ サポートを追加し確認します webkit.orgに加えて Browser Petsは SafariとWebKitチームにとって 最も重要な内部ツールです 部内全員のお気に入りの 子猫や子犬を 管理しておくことは Webプッシュにより これまでになく 簡単になりました 内部のBrowserPets ドメインにはページの高速化や 複数タブ間の同期のための Service Workerスクリプトがあります ServiceWorkerスクリプトは 次のようになります エンジニアがペットページに アクセスすると JavaScriptの抜粋により ServiceWorkerスクリプトが 登録済みか登録が必要 かを判断します ここではベストプラクティスとして 前述した機能検出を 実践していることに 着目してください 前提条件が満たされたら プッシュを 購読する準備が完了します 明示的なジェスチャなしに プッシュを要求 できないことはお忘れなく ボタンのハンドラに応答して このスクリプトを実行することは その要件を満たす 方法の1つです ユーザーがボタンを クリックした時に プッシュを要求する コードがこちらです これらの各ポイントに ついて説明します まずプッシュリクエストを 構成する必要があります 重要な点は サーバが Appleのプッシュサーバに 対して識別するための 公開鍵です ここでは他のブラウザと 同様VAPID技術を利用します ここではVAPIDの詳細に ついては説明しませんが サーバのセットアップに 役立つリソースや ソリューションがWeb上に 多くあります VAPIDキーを設定して 購読リクエストを構成できます プッシュを ユーザーに対し常に 表示するよう設定 するようにしてください JavaScript Push API の標準では オプションではサイレント ランタイムに対応しますが ほとんどのブラウザでは サポートされていません Safariでもサポート していません ほとんどのサイト同様 BrowserPetsでも不要です 次にプッシュの許可 リクエストについて このJavaScriptにより ユーザーが承認または 拒否するための プロンプトが表示されます ユーザーが許可を与えた場合 すべてのSafariチーム メンバーがペットに対して ブラウザでユーザーに アクセスする方法の 詳細を含むオブジェクトが 提供されます URLエンドポイントや 転送用メッセージの暗号化に 使用されるキーなどが それです 最後にすべての詳細を サーバに送信します 前述のようにこれの詳細は Appによって 詳細が異なります BrowserPets サーバは WordPressを使用しており Webプッシュプラグインが すでにあります 同じことがバックエンドにも 当てはまる可能性が高く ほぼすべてのセットアップで 適切なソリューションを Web上で見つけられます 次にService Workerの JavaScriptコードに戻ります pushなどの新規イベントを 処理します プッシュメッセージが ブラウザに送信されると ServiceWorkerに プッシュイベントが送信 そのイベントには サーバから 送信されたデータに アクセスするオブジェクトが 含まれます ここではJSONアクセッサを 使用します プッシュを購読 したときには JavaScriptは常にユーザーに 表示されますよね つまりプッシュごとに常に プラットフォームネイティブ通知を 表示する必要が あるわけです これはプッシュイベント ハンドラで迅速に処理 URLによるアクションの 設定など通知を 構成するために必要なものを JSONBLOBから取得 この後それは利用可能に なります 通知が表示されたら ユーザー通知をクリック スクリプトが処理する もう1つのイベントです このハンドラでは BrowserPetsは クリックされた通知から URLを取得します これはただし一般的な パターンです Webプッシュサポートに必要な JavaScriptはこれのみ 開発中にヘルプを 得るのが最善ですが そこでWebインスペクタの 出番です ブラウザタブで開いている サイトのデバッグに加え Webインスペクタは インスタンスを検査し イベントハンドラにブレーク ポイントを設定 これらすべてを組み合わせて プッシュを購読する JavaScriptとコードを デバッグして プッシュイベントと通知 イベントを処理します さらにApple Push Notification サーバは 問題発生時に プッシュメッセージを 人間が読める形式の エラーとして表示します 詳細はこのセッション 関連リンクをご確認ください コードを書いているときに 気付いたポイントですが ユーザーのプライバシーと 電力使用量について 詳しく説明したいと思います ここで改めて言うまでも なく重要なことがあります プッシュの購読には ユーザージェスチャが必要です 他の特権機能と同様に それはユーザーが Webプッシュを有効に するよう 要求する点において 適切なことです プッシュサブスクリプションを 要求する方法のコードを同様 プッシュがユーザーに表示 される必要があります プッシュイベントの処理は JavaScriptがサイレント ランタイムを取得するため ではありません これはユーザーの信頼と バッテリー寿命に反します プッシュイベントを処理 するときは通知センターに 通知する必要があります 他のブラウザはプッシュ ユーザーの表示という 対策がありますが それはSafariも同様です Venturaのベータビルドでは タイムリーに 通知できない3つの プッシュイベントの後 サイトのプッシュは 取り消されます 許可ワークフローを再度 実行する必要があります 以上です 開発者アカウントなしで 使えるWebプッシュの サポートを心から誇りに 思っています 標準コーディングや機能 検出を使用している限り Safari16でのWebプッシュの利点は 無意識のうちに Safariを除外しない限り 享受できます 今年もSafariとWebKit以外 にもたくさんの新機能を追加 詳細についてはセッションを チェックしてください ご清聴ありがとうございました 残りのセッションも お楽しみください
-
-
8:27 - BrowserPetsWorker.js
// BrowserPetsWorker.js function handleMessageEvent(event) { // ... }; self.addEventListener('message', (event) => { handleMessageEvent(event); }); function primeCaches() { // ... }; self.addEventListener('install', (event) => { primeCaches(); }); self.addEventListener('fetch', (event) => { event.respondWith(caches.match(event.request)); });
-
8:42 - BrowserPetsMain.js
// BrowserPetsMain.js var registration; if ('serviceWorker' in navigator) { let registration = await navigator.serviceWorker.getRegistration(); if (!registration) registration = await navigator.serviceWorker.register('BrowserPetsWorker.js'); }
-
9:00 - BrowserPetsMain.js subscribeToPush()
// BrowserPetsMain.js async function subscribeToPush() { // ... } // BrowserPetsMain.html <button onclick="subscribeToPush()">Register for Updates</button>
-
9:19 - BrowserPetsMain.js subscribe
// BrowserPetsMain.js async function subscribeToPush() { let serverPublicKey = VAPID_PUBLIC_KEY; let subscriptionOptions = { userVisibleOnly: true, applicationServerKey: serverPublicKey }; let subscription = await swRegistration.pushManager.subscribe(subscriptionOptions); sendSubcriptionToServer(subscription); }
-
9:36 - BrowserPetsMain.js subscriptionOptions
// BrowserPetsMain.js async function subscribeToPush() { let serverPublicKey = VAPID_PUBLIC_KEY; let subscriptionOptions = { userVisibleOnly: true, applicationServerKey: serverPublicKey }; let subscription = await swRegistration.pushManager.subscribe(subscriptionOptions); sendSubcriptionToServer(subscription); }
-
10:21 - BrowserPetsMain.js request permission to push
// BrowserPetsMain.js async function subscribeToPush() { let serverPublicKey = VAPID_PUBLIC_KEY; let subscriptionOptions = { userVisibleOnly: true, applicationServerKey: serverPublicKey }; let subscription = await swRegistration.pushManager.subscribe(subscriptionOptions); sendSubcriptionToServer(subscription); }
-
11:13 - BrowserPetsWorker.js push
// BrowserPetsWorker.js self.addEventListener('push', (event) => { let pushMessageJSON = event.data.json(); // Our server puts everything needed to show the notification // in our JSON data. event.waitUntil(self.registration.showNotification(pushMessageJSON.title, { body: pushMessageJSON.body, tag: pushMessageJSON.tag, actions: [{ action: pushMessageJSON.actionURL, title: pushMessageJSON.actionTitle, }] })); }
-
12:06 - BrowserPetsWorker.js notification click
// BrowserPetsWorker.js self.addEventListener('notificationclick', async function(event) { if (!event.action) return; // This always opens a new browser tab, // even if the URL happens to already be open in a tab. clients.openWindow(event.action); });
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。