1

我已將service-worker.js和清單添加到我的網站,並使用燈塔測試了該頁面,顯示我的網頁已準備好顯示「添加到主屏幕「給用戶。 但是,如果用戶在不關閉提示符的情況下關閉標籤頁,則提示不會顯示兩次。是否有其他方法可以實現此目的? 這裏是我的清單如果選項卡關閉,添加到主屏幕提示不再顯示

{ 
    "short_name": "TestApp", 
    "name": "Long Name", 
    "icons": [ 
    { 
     "src":"images/favicon-192.png", 
     "sizes": "192x192", 
     "type": "image/png" 
    }, 
    { 
     "src":"images/favicon-256.png", 
     "sizes": "256x256", 
     "type": "image/png" 
    }, 
    { 
     "src":"images/favicon-384.png", 
     "sizes": "384x384", 
     "type": "image/png" 
    }, 
    { 
     "src":"images/favicon-512.png", 
     "sizes": "512x512", 
     "type": "image/png" 
    }     
    ], 
    "start_url": "/", 
    "background_color": "#fff", 
    "theme_color": "#d2d2d2", 
    "display": "standalone" 
} 

這裏是我的服務人員JavaScript文件

/* 
Copyright 2015 Google Inc. All Rights Reserved. 
Licensed under the Apache License, Version 2.0 (the "License"); 
you may not use this file except in compliance with the License. 
You may obtain a copy of the License at 
http://www.apache.org/licenses/LICENSE-2.0 
Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an "AS IS" BASIS, 
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
See the License for the specific language governing permissions and 
limitations under the License. 
*/ 

'use strict'; 

// Incrementing CACHE_VERSION will kick off the install event and force previously cached 
// resources to be cached again. 
const CACHE_VERSION = 3; 
let CURRENT_CACHES = { 
    offline: 'offline-v' + CACHE_VERSION 
}; 
const OFFLINE_URL = 'offline.html'; 

function createCacheBustedRequest(url) { 
    let request = new Request(url, {cache: 'reload'}); 
    // See https://fetch.spec.whatwg.org/#concept-request-mode 
    // This is not yet supported in Chrome as of M48, so we need to explicitly check to see 
    // if the cache: 'reload' option had any effect. 
    if ('cache' in request) { 
    return request; 
    } 

    // If {cache: 'reload'} didn't have any effect, append a cache-busting URL parameter instead. 
    let bustedUrl = new URL(url, self.location.href); 
    bustedUrl.search += (bustedUrl.search ? '&' : '') + 'cachebust=' + Date.now(); 
    return new Request(bustedUrl); 
} 


self.addEventListener('install', event => { 
    event.waitUntil(
    // We can't use cache.add() here, since we want OFFLINE_URL to be the cache key, but 
    // the actual URL we end up requesting might include a cache-busting parameter. 
    fetch(createCacheBustedRequest(OFFLINE_URL)).then(function(response) { 
     return caches.open(CURRENT_CACHES.offline).then(function(cache) { 
     return cache.put(OFFLINE_URL, response); 
     }); 
    }) 
); 
}); 

self.addEventListener('activate', event => { 
    // Delete all caches that aren't named in CURRENT_CACHES. 
    // While there is only one cache in this example, the same logic will handle the case where 
    // there are multiple versioned caches. 
    let expectedCacheNames = Object.keys(CURRENT_CACHES).map(function(key) { 
    return CURRENT_CACHES[key]; 
    }); 

    event.waitUntil(
    caches.keys().then(cacheNames => { 
     return Promise.all(
     cacheNames.map(cacheName => { 
      if (expectedCacheNames.indexOf(cacheName) === -1) { 
      // If this cache name isn't present in the array of "expected" cache names, 
      // then delete it. 
      console.log('Deleting out of date cache:', cacheName); 
      return caches.delete(cacheName); 
      } 
     }) 
    ); 
    }) 
); 
}); 

self.addEventListener('fetch', event => { 
    // We only want to call event.respondWith() if this is a navigation request 
    // for an HTML page. 
    // request.mode of 'navigate' is unfortunately not supported in Chrome 
    // versions older than 49, so we need to include a less precise fallback, 
    // which checks for a GET request with an Accept: text/html header. 
    if (event.request.mode === 'navigate' || 
     (event.request.method === 'GET' && 
     event.request.headers.get('accept').includes('text/html'))) { 
    console.log('Handling fetch event for', event.request.url); 
    event.respondWith(
     fetch(event.request).catch(error => { 
     // The catch is only triggered if fetch() throws an exception, which will most likely 
     // happen due to the server being unreachable. 
     // If fetch() returns a valid HTTP response with an response code in the 4xx or 5xx 
     // range, the catch() will NOT be called. If you need custom handling for 4xx or 5xx 
     // errors, see https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/fallback-response 
     console.log('Fetch failed; returning offline page instead.', error); 
     return caches.match(OFFLINE_URL); 
     }) 
    ); 
    } 

    // If our if() condition is false, then this fetch handler won't intercept the request. 
    // If there are any other fetch handlers registered, they will get a chance to call 
    // event.respondWith(). If no fetch handlers call event.respondWith(), the request will be 
    // handled by the browser as if there were no service worker involvement. 
}); 

回答

1

我可能是錯的這一個,但如果您的用戶尚未接受按鈕點擊,我認爲這是一個被視爲已解僱。

您的用戶能夠再次看到的唯一時間是他們是否清除了該特定網站的緩存和瀏覽器設置。

谷歌還記載: enter image description here

來源:https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android

+0

你能提供一個鏈接,你的屏幕截圖的來源。 – Philipp

+0

@Philipp https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android –

相關問題