1

我正在使用以下脚本注册服务人员,并想检查此服务人员是否支持推送?仅出于测试目的,我正在打印“打印服务工作者”,但它没有打印到控制台。请帮助我触发我出错的地方?

function register()
{
    if ('serviceWorker' in navigator)
    {
        navigator.serviceWorker.register('service-worker.js', {scope: scope}).then(initialiseState);
    } 
    else {
        console.warn('Service workers aren\'t supported in this browser.');
    }
}

function initialiseState() 
{ 
navigator.serviceWorker.ready.then(function(serviceWorkerRegistration)
        {  console.log('Print Service worker');});
}

提前致谢

4

2 回答 2

5

首先,解释为什么您没有看到您期望的日志记录:

除非您self.clients.claim()在 Service Worker 中调用,否则它不会在最初注册时在导航期间控制当前网页。至于navigator.serviceWorker.ready承诺,直到有一个控制页面的服务工作者才解决。将这两者放在一起,我不希望您console.log()在第一次访问该页面时执行,但我希望在后续访问时执行它(如果服务工作者安装正确)。

如果您希望您的服务人员在您第一次导航到该页面时控制该页面,则有一个使用示例。self.clients.claim()

至于您的实际问题,如果您觉得需要功能检测服务工作者推送支持,您应该能够检查对象'pushManager' in registration在哪里,就像解决registration的对象一样。无需等到您的页面由服务人员控制。所以这应该工作:ServiceWorkerRegistrationnavigator.serviceWorker.register()

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('service-worker.js').then(function(registration) {
    if ('pushManager' in registration) {
      // The service worker supports push
    } else {
      // The service worker doesn't support push
    }
  });
} else {
  // The browser doesn't support service workers
}
于 2015-07-27T14:47:22.420 回答
0

您的问题可能是您尚未声明范围变量?尝试:

navigator.serviceWorker.register('service-worker.js', { scope: '/' }).then(initialiseState);

另一种可能的可能性是您没有正确添加清单文件,说明从“在 Google 开发人员控制台上创建项目”开始:https ://developers.google.com/web/updates/2015/03/在开放网络上推送通知?hl=en

于 2015-07-27T10:26:33.210 回答