0
votes

Blazor WASM PWA ne peut pas changer l'icône, ne peut pas changer le nom

Je suis aux prises avec un cas où j'ai fait de bonnes recherches sur la façon de le faire. Cela fonctionne pour tout le monde mais pas pour moi !!

Environnement:

  • Microsoft Windows 10 Professionnel
  • Visual Studio Community Edition 2019

J'ai donc créé un projet et sélectionné l'application Web progressive (PWA) dès le départ pour que tout ce dont j'avais besoin soit généré automatiquement. Également rendu l'application hébergée par ASP.NET Core.

Le projet de démarrage est Rihal.Server en mode autonome (pas IIS ou Docker).

Lorsque je lance l'application, je reçois l'invite par défaut dans Chrome pour installer l'application. Lorsque je clique sur l'icône «+», j'obtiens l'icône Blazor par défaut et le nom de l'application «Rihal». Jusqu'ici tout va bien. Lorsque je change l'icône et le nom, je continue à obtenir les valeurs par défaut! entrez la description de l'image ici

  1. J'ai essayé de nettoyer et de reconstruire tous les projets un par un, sans erreur.
  2. J'ai essayé de redémarrer Visual Studio.
  3. J'ai essayé de changer d'autres choses dans le manifeste comme la couleur d'arrière-plan pour voir tout changement, rien ne change.
  4. J'ai vérifié l'action de construction (contenu). La copie par défaut dans le répertoire de sortie est (Ne pas copier), le passage à (Copier toujours) n'a aucun effet.

C'est comme si le manifeste était complètement ignoré.

J'ai développé d'autres parties de cette application, puis je suis venu pour changer l'icône et le nom:

  1. Remplacement de l'icône par défaut (même icône utilisée pour 192 à une résolution plus petite) entrez la description de l'image ici

  2. J'ai mis à jour mon manifest.json pour la taille 192 et le nom / nom court: (j'ai également essayé d'ajouter plusieurs tailles).

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
    <RazorLangVersion>3.0</RazorLangVersion>
    <ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>embedded</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.2.0-preview3.20168.3" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.0" PrivateAssets="all" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="3.2.0" PrivateAssets="all" />
    <PackageReference Include="Microsoft.Authentication.WebAssembly.Msal" Version="3.2.0" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="3.1.5" />
    <PackageReference Include="System.Net.Http.Json" Version="3.2.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\Shared\Rihal.Shared.csproj" />
  </ItemGroup>

  <ItemGroup>
    <ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
  </ItemGroup>
</Project>

Autres fichiers le cas échéant:

Rihal.Client service-worker.js

// Caution! Be sure you understand the caveats before publishing an application with
// offline support. See https://aka.ms/blazor-offline-considerations

self.importScripts('./service-worker-assets.js');
self.addEventListener('install', event => event.waitUntil(onInstall(event)));
self.addEventListener('activate', event => event.waitUntil(onActivate(event)));
self.addEventListener('fetch', event => event.respondWith(onFetch(event)));

const cacheNamePrefix = 'offline-cache-';
const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/ ];
const offlineAssetsExclude = [ /^service-worker\.js$/ ];

async function onInstall(event) {
    console.info('Service worker: Install');

    // Fetch and cache all matching items from the assets manifest
    const assetsRequests = self.assetsManifest.assets
        .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
        .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
        .map(asset => new Request(asset.url, { integrity: asset.hash }));
    await caches.open(cacheName).then(cache => cache.addAll(assetsRequests));
}

async function onActivate(event) {
    console.info('Service worker: Activate');

    // Delete unused caches
    const cacheKeys = await caches.keys();
    await Promise.all(cacheKeys
        .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName)
        .map(key => caches.delete(key)));
}

async function onFetch(event) {
    let cachedResponse = null;
    if (event.request.method === 'GET') {
        // For all navigation requests, try to serve index.html from cache
        // If you need some URLs to be server-rendered, edit the following check to exclude those URLs
        const shouldServeIndexHtml = event.request.mode === 'navigate';

        const request = shouldServeIndexHtml ? 'index.html' : event.request;
        const cache = await caches.open(cacheName);
        cachedResponse = await cache.match(request);
    }

    return cachedResponse || fetch(event.request);
}

Rihal.Client service-worker.published.js

// In development, always fetch from the network and do not enable offline support.
// This is because caching would make development more difficult (changes would not
// be reflected on the first load after each change).
self.addEventListener('fetch', () => { });

Fichier csproj Rihal.Client

{
  "name": "Rihal Timesheet",
  "short_name": "Timesheet",
  "start_url": "./",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#03173d",
  "icons": [
    {
      "src": "icon-512.png",
      "type": "image/png",
      "sizes": "512x512"
    },
    {
      "src": "icon-192.png",
      "type": "image/png",
      "sizes": "192x192"
    }
  ]
}


3 commentaires

Avez-vous essayé de désinstaller le PWA de votre système d'exploitation / navigateur et de l'installer à nouveau après la modification du manifeste?


Salut, oui j'ai essayé; sur chrome, il ne vous permet normalement pas d'installer tant que vous n'avez pas désinstallé celui que vous avez. J'ai complètement fermé Chrome et rouvert. Maintenant, l'icône est mise à jour mais le nom est inchangé! Ça me dérange.


L'icône est mise à jour sur Chrome sur Windows, mais l'application Android affiche toujours l'ancienne icône! Le nom n'a pas été mis à jour non plus.


3 Réponses :


0
votes

Je pense que vous devez incrémenter la version du cache chaque fois que vous souhaitez que le client télécharge les derniers fichiers.

Dans votre navigateur, enregistrez un fichier JavaScript où const CACHE_VERSION = 1.01 . Vous pouvez incrémenter la valeur chaque fois que vous souhaitez que le client mette à jour

https://blog.jeremylikness.com/blog/implement-progressive-web-app-hugo/


1 commentaires

Le cache est un sujet intéressant. J'ai lu quelque part qu'il devrait être mis à jour automatiquement. Cette approche est complexe! Il doit y avoir un moyen plus simple.



3
votes

Ouvrez la fenêtre de débogage des navigateurs. Chrome ou le nouveau Edge. Pendant qu'il est ouvert, cliquez avec le bouton droit sur le bouton d'actualisation de votre page, sélectionnez => Vider le cache et recharger dur.

J'ai trouvé que vous pouvez le faire dans le fichier csproj des clients. Forçage et mise à jour dans le service worker.

<Target Name="PublishServiceWorker" AfterTargets="CopyFilesToPublishDirectory">
        <WriteLinesToFile File="$(PublishDir)wwwroot\service-worker.js" Lines="/* $([System.Guid]::NewGuid()) */" />
</Target>


3 commentaires

Merci. Cela a résolu le problème pour moi. Je garderai un œil sur ce qui résout le problème pour mes utilisateurs sans qu'ils aient besoin de le savoir.


Vous ne devriez pas avoir à le faire. Ces éléments sont censés être statiques. C'est pourquoi les navigateurs ne les actualisent pas. Cela ne devrait arriver aux développeurs que lors de la configuration initiale.


Merci. J'ai raté la 2ème moitié de la réponse!



1
votes

Je rencontrais donc ce problème en novembre 2020 (VS2019 avec toutes les mises à jour) en construisant un nouveau Blazor WASM PWA. Je n'ai pas pu obtenir le site ou installer PWA pour afficher le nouveau contenu de manière fiable. J'ai écrit une petite application pour modifier la version du cache hors ligne dans le service-worker.js. J'appelle cette application dans mes événements de post build pour les projets client et serveur. Ainsi, lorsque je publie, ma version de cache est toujours mise à jour et les PWA sont mis à jour comme je m'y attendais.

static void Main(string[] args)
    {
        string startPoint = "const cacheName =";
        string endPoint = ";";
        string fileNameToEdit = args[0];
        string newContents = string.Empty;

        using(var sr = new StreamReader(fileNameToEdit))
        {
            newContents = sr.ReadToEnd();
            int start = newContents.IndexOf("const cacheName = ");
            int end = newContents.IndexOf(";", start) + 1;
            string stringToReplace = newContents.Substring(start, end - start);

            string newString = "const cacheName = 'cache-version-" + $"{DateTime.Now.Ticks}" + "';";

            newContents = newContents.Replace(stringToReplace, newString);

            sr.Close();
        }

        File.WriteAllText(fileNameToEdit, newContents);

        Environment.Exit(0);
    }


1 commentaires

Cela semble être une bonne solution. Je ne l'ai pas encore testé, j'espère que quelqu'un le fera et commentera. Sélectionné comme réponse jusqu'à preuve du contraire.