Можно ли сделать так, чтобы если я (разработчик) изменю код, пользователи все равно будут открывать установленную версию, и я не смогу принудительно обновить PWA?
Я пробовал все кэшировать, но сейчас при открытии PWA он сразу отправляет get-запрос в service.js, который возвращает 304 (данные не изменились). Теперь я могу просто переписать его и принудительно обновить приложение пользователя, добавив скрипт, который (например) отправляет заметки пользователя на мой сервер. Для обновления пользователю просто нужно закрыть приложение и открыть его снова. Конечно, с такой «уязвимостью» моим приложением никто не воспользуется.
Мне нужно как-то гарантировать, что я не смогу ничего сделать без ведома пользователя. Есть ли способы это сделать?
Вот пример первой версии PWA, не подразумевающей обновления:
index.html
Код: Выделить всё
pwa
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('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
Мобильная версия