Chrome93のPWA基準へのたぶん一番簡単な対処
chrome系のブラウザでWebページをホームへインストールするための基準が少し厳しくなる。service workerのfetchイベントが空だと現在以下の警告が出る。
Site cannot be installed: Page does not work offline. Starting in Chrome 93, the installability criteria is changing, and this site will not be installable. See https://goo.gle/improved-pwa-offline-detection for more information.
https://goo.gle/improved-pwa-offline-detection
オフラインに対応していなければ、2021年8月のChrome93からはインストールがブロックされるとのこと。とはいえ完全に動作する必要はなくフォールバックページなどが提供されればいいそうだ。
サーバ通信前提のWebページをオフライン対応するのは現実的ではないので、その方向で回避してみることにする。(オンライン前提のWebページをインストール可能にする必要があるのかというのもあるが、そこは色々な事情があるのだ)
対応
serviceworker.js
var _cashVersion = "cashe0.0.0.1"
var _offlinePage = '/offline.html'
self.addEventListener("install", function(event) {
console.log("service worker call install.", event)
event.waitUntil(
caches.open(_cashVersion)
.then(function (cache) {
cache.add(_offlinePage);
})
);
})
self.addEventListener('fetch', function(event) {
const url = new URL(event.request.url)
if(url.pathname == "/"){
if(!navigator.onLine){
event.respondWith(caches.match(_offlinePage))
} else {
let ret = fetch(event.request).then(res=>{
return res
}).catch(e=>{
return caches.match(_offlinePage)
})
event.respondWith(ret)
}
}
})
チェックは疑似オフライン状態でトップページ(manifest.jsonのstart_url?)のリクエストに対して、200のレスポンスが返ってくるかどうかで判断しているようだ。なのでオフライン用のページ(offline.html)を用意してトップページのリクエストに対して返すようにする。
installイベント
service workerの登録時に、offline.htmlをキャッシュする。なおoffilne.htmlはほぼ更新されないようなものをイメージしている。
fetchイベント
トップページへのリクエストが来たら、オフラインの場合キャッシュからoffline.htmlを返す。
これだけでもよさそうだが、警告表示は消えなかった。どうやら可否チェックの時はnavigater.onLineはtrueのままのようだ。なのでサーバへfetchを投げてエラーになった場合にもoffline.htmlを返すようにする。
以上
これでオフラインの場合には専用ページが表示され、警告も現状は出なくなった。実際にChrome93でインストール基準を満たすかはリリースされるまで確証はないが。
コメント
コメントを投稿