From 587e9ed9ba13eca315ace5e4b67489fbbb10d455 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Mon, 30 Jan 2023 13:23:19 -0300 Subject: [PATCH] FEATURE: Enable service worker for Apple devices (#19643) This is necessary so MacOS Ventura (and in 2023 iOS) can use our new default push notifications. We still disable caching of dynamic routes on Apple devices due to it's always being buggy there. --- .../discourse/app/lib/register-service-worker.js | 7 +------ app/assets/javascripts/service-worker.js.erb | 3 ++- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/discourse/app/lib/register-service-worker.js b/app/assets/javascripts/discourse/app/lib/register-service-worker.js index c4fa02bc94d..5a200af25c7 100644 --- a/app/assets/javascripts/discourse/app/lib/register-service-worker.js +++ b/app/assets/javascripts/discourse/app/lib/register-service-worker.js @@ -6,12 +6,7 @@ export function registerServiceWorker( registerOptions = {} ) { if (window.isSecureContext && "serviceWorker" in navigator) { - const caps = container.lookup("capabilities:main"); - const isAppleBrowser = - caps.isSafari || - (caps.isIOS && !window.matchMedia("(display-mode: standalone)").matches); - - if (serviceWorkerURL && !isAppleBrowser) { + if (serviceWorkerURL) { navigator.serviceWorker.getRegistrations().then((registrations) => { for (let registration of registrations) { if ( diff --git a/app/assets/javascripts/service-worker.js.erb b/app/assets/javascripts/service-worker.js.erb index e54831fef04..796670025f1 100644 --- a/app/assets/javascripts/service-worker.js.erb +++ b/app/assets/javascripts/service-worker.js.erb @@ -19,11 +19,12 @@ var externalCacheName = "external-" + cacheVersion; // https://bugs.chromium.org/p/chromium/issues/detail?id=1286367 var chromeVersionMatch = navigator.userAgent.match(/Chrome\/97.0.(\d+)/); var isBrokenChrome97 = chromeVersionMatch && parseInt(chromeVersionMatch[1]) <= 4692; +var isApple = /iPhone|iPod|Mac OS/.test(navigator.userAgent); // Cache all GET requests, so Discourse can be used while offline workbox.routing.registerRoute( function(args) { - return args.url.origin === location.origin && !authUrls.some(u => args.url.pathname.startsWith(u)) && !isBrokenChrome97; + return args.url.origin === location.origin && !authUrls.some(u => args.url.pathname.startsWith(u)) && !isBrokenChrome97 && !isApple; }, // Match all except auth routes new workbox.strategies.NetworkFirst({ // This will only use the cache when a network request fails cacheName: discourseCacheName,