Blazor WASM PWA无法更改图标,无法更改名称

时间:2020-07-02 11:06:31

标签: c# asp.net-core blazor manifest.json blazor-webassembly

我正在努力研究如何做到这一点。它适用于所有人,但不适用于我!

环境:

  • Microsoft Windows 10 Pro
  • Visual Studio社区版2019

因此,我创建了一个项目,并从一开始就选择了渐进式Web应用程序(PWA),以自动生成我需要的所有内容。还使应用程序ASP.NET Core得以托管。

启动项目为Rihal.Server,处于独立模式(不是IIS或Docker)。

启动应用程序时,我在Chrome中得到默认提示以安装应用程序。当我单击“ +”图标时,会得到默认的Blazor图标和应用程序的名称“ Rihal”。到现在为止还挺好。当我更改图标和名称时,我仍然保持默认设置! enter image description here

  1. 我尝试一个接一个地清理和重建所有项目,没有错误。
  2. 我尝试重新启动Visual Studio。
  3. 我尝试更改清单中的其他内容(例如背景色)以查看任何更改,但没有任何变化。
  4. 我已经检查了构建操作(内容)。默认复制到输出目录为(不复制),更改为(始终复制)无效。

好像清单被完全忽略了。

我已经开发了该应用的其他部分,然后四处更改图标和名称:

  1. 替换了默认图标(与较小的分辨率用于192相同的图标) enter image description here

  2. 将我的manifest.json更新为192个大小和名称/简称:(我也尝试添加多个大小)。

{
  "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"
    }
  ]
}

其他相关文件:

Rihal.Client service-worker.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', () => { });

Rihal.Client service-worker.published.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 csproj文件

<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>

3 个答案:

答案 0 :(得分:3)

打开浏览器调试窗口。 Chrome或新的Edge。打开后,右键单击页面上的刷新按钮,选择=>清空缓存并重新加载。

我发现您可以在客户端csproj文件中执行此操作。在服务工作者中强制执行和更新。

csv_files = s3.list_objects_v2(s3_bucket_path)
    for obj in csv_files['Contents']:
        key = obj['Key']

答案 1 :(得分:1)

因此,我在2020年11月(VS2019具有所有更新)遇到此问题时,建造了一个新的Blazor WASM PWA。我无法获得该站点或安装的PWA来可靠地显示新内容。我写了一个小应用程序来修改service-worker.js中的离线缓存版本。我在客户端和服务器项目的构建后事件中称此应用程序。因此,当我发布时,缓存版本总是会更新,而PWA也会按照我的期望进行更新。

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);
    }

答案 2 :(得分:0)

我认为,只要您希望客户端下载最新文件,就必须增加缓存的版本。

在导航器中的plotKML处注册一个JavaScript文件。只要您希望客户端更新,就可以增加该值

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