我正在努力研究如何做到这一点。它适用于所有人,但不适用于我!
环境:
因此,我创建了一个项目,并从一开始就选择了渐进式Web应用程序(PWA),以自动生成我需要的所有内容。还使应用程序ASP.NET Core得以托管。
启动项目为Rihal.Server,处于独立模式(不是IIS或Docker)。
启动应用程序时,我在Chrome中得到默认提示以安装应用程序。当我单击“ +”图标时,会得到默认的Blazor图标和应用程序的名称“ Rihal”。到现在为止还挺好。当我更改图标和名称时,我仍然保持默认设置!
好像清单被完全忽略了。
我已经开发了该应用的其他部分,然后四处更改图标和名称:
{ "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>
答案 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/