Можно ли отключить обновления в PWA?Javascript

Форум по Javascript
Anonymous
Можно ли отключить обновления в PWA?

Сообщение Anonymous »

У меня есть PWA, предназначенное для создания заметок. Исходный код открыт. Данные заметки хранятся на устройстве пользователя.
Можно ли сделать так, чтобы если я (разработчик) изменю код, пользователи все равно будут открывать установленную версию, и я не смогу принудительно обновить PWA?
Я пробовал все кэшировать, но сейчас при открытии PWA он сразу отправляет get-запрос в service.js, который возвращает 304 (данные не изменились). Теперь я могу просто переписать его и принудительно обновить приложение пользователя, добавив скрипт, который (например) отправляет заметки пользователя на мой сервер. Для обновления пользователю просто нужно закрыть приложение и открыть его снова. Конечно, с такой «уязвимостью» моим приложением никто не воспользуется.
Мне нужно как-то гарантировать, что я не смогу ничего сделать без ведома пользователя. Есть ли способы это сделать?
Вот пример первой версии PWA, не подразумевающей обновления:
index.html

Код: Выделить всё

pwa

if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js');
});
}


sw.js

Код: Выделить всё

const CACHE_NAME = 'pwa-cache-v1';

self.addEventListener('install', (e) => {
e.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(['./', './index.html', './manifest.json','./192x192.jpg','./512x512.jpg','./favicon.ico']);
})
);
});

self.addEventListener('fetch', (e) => {
e.respondWith(
caches.match(e.request).then((response) => {
return response || fetch(e.request);
})
);
});
Вот принудительное обновление для пользователя:
sw.js

Код: Выделить всё

const CACHE_NAME = 'pwa-cache-v2';

self.addEventListener('install', (e) => {
self.skipWaiting();
e.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(['./', './index.html', './manifest.json']);
})
);
});

self.addEventListener('activate', (e) => {
e.waitUntil(
caches.keys().then((keys) => {
return Promise.all(
keys.map((key) => {
if (key !== CACHE_NAME) {
return caches.delete(key);
}
})
);
}).then(() => {
return self.clients.claim();
})
);
});
Пользователь не очистил кеш и не удалил приложение, а просто закрыл и снова открыл его — теперь у него новая версия.
Представьте, что вы используете мессенджер со сквозным шифрованием. Его исходный код опубликован, и вы можете видеть, что на сервер отправляются ТОЛЬКО зашифрованные сообщения. Но в какой-то момент приложение обновится, и теперь вместе с вашими сообщениями будут отправляться и ключи шифрования. Чтобы этого не произошло, нужно отключить возможность обновления приложения.
Я повторю: я не хочу, чтобы PWA могла обновляться. Мне нужно сделать это максимально безопасным для пользователя.

Подробнее здесь: https://stackoverflow.com/questions/799 ... tes-in-pwa

Вернуться в «Javascript»