Made progressive web app installable

This commit is contained in:
2026-05-12 17:09:27 +02:00
parent 7d9328b865
commit 06398e98e2
6 changed files with 71 additions and 56 deletions

View File

@@ -409,6 +409,9 @@ else()
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/index.html" $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/coi-serviceworker.js" $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/manifest.json" $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/icon-192.png" $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/icon-512.png" $<TARGET_FILE_DIR:${PROJECT_NAME}>
)
endif()

View File

@@ -1,57 +1,26 @@
/* coi-serviceworker.js */
/* coi-serviceworker.js - Cross-Origin Isolation + PWA support */
if (typeof window === "undefined") {
// Código del Worker: Intercepta peticiones
self.addEventListener("install", () => self.skipWaiting());
// Service Worker context
self.addEventListener("install", () => self.skipWaiting());
self.addEventListener("activate", (event) =>
event.waitUntil(self.clients.claim())
);
self.addEventListener("activate", (event) =>
event.waitUntil(self.clients.claim())
);
self.addEventListener("fetch", (event) => {
if (event.request.method !== "GET") return;
event.respondWith(
fetch(event.request)
.then((response) => {
if (response.status === 0) return response;
const newHeaders = new Headers(response.headers);
newHeaders.set("Cross-Origin-Embedder-Policy", "require-corp");
newHeaders.set("Cross-Origin-Opener-Policy", "same-origin");
newHeaders.set("Cross-Origin-Resource-Policy", "cross-origin");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
})
.catch(() => fetch(event.request))
);
});
} else {
// Código de la Ventana: Registra el worker y recarga
(function () {
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register(window.document.currentScript.src)
.then((registration) => {
registration.addEventListener("updatefound", () => {
// Si hay una actualización, recargamos
location.reload();
});
if (registration.active && !navigator.serviceWorker.controller) {
// Si el worker está activo pero no controla la página aún, recargamos
location.reload();
}
});
}
// Si ya estamos aislados, perfecto
if (window.crossOriginIsolated) {
console.log("Aislamiento de origen ACTIVADO");
}
})();
}
self.addEventListener("fetch", (event) => {
if (event.request.method !== "GET") return;
event.respondWith(
fetch(event.request).then((response) => {
if (response.status === 0 || response.type === "opaque") return response;
const headers = new Headers(response.headers);
headers.set("Cross-Origin-Embedder-Policy", "require-corp");
headers.set("Cross-Origin-Opener-Policy", "same-origin");
headers.set("Cross-Origin-Resource-Policy", "cross-origin");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers,
});
}).catch(() => fetch(event.request))
);
});

BIN
misc/web/icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
misc/web/icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -2,6 +2,12 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="manifest" href="manifest.json">
<meta name="theme-color" content="#000000">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-icon" href="icon-192.png">
<title>MCPE 0.6.1</title>
<style>
html, body {
@@ -23,7 +29,20 @@
<canvas id="canvas"></canvas>
<script src="coi-serviceworker.js"></script>
<script>
if ('serviceWorker' in navigator) {
var reloadedForSw = false;
navigator.serviceWorker.register('./coi-serviceworker.js', { scope: './' }).then(function () {
navigator.serviceWorker.addEventListener('controllerchange', function () {
if (reloadedForSw) return;
reloadedForSw = true;
window.location.reload();
});
}).catch(function (error) {
console.warn('Service worker registration failed:', error);
});
}
</script>
<script>
var Module = {
@@ -45,4 +64,4 @@
<script src="MinecraftPE.js"></script>
</body>
</html>
</html>

24
misc/web/manifest.json Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "MCPE 0.6.1",
"short_name": "MCPE 0.6.1",
"description": "Minecraft Pocket Edition 0.6.1 Alpha - Web Build",
"id": "./",
"start_url": "./",
"scope": "./",
"display_override": ["standalone"],
"display": "standalone",
"background_color": "#000000",
"theme_color": "#000000",
"icons": [
{
"src": "icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}