在 angular.js 应用程序中注册服务工作者

Register service worker in angular.js application

我正在使用 ionic 和 angular.js 创建一个应用程序,但我在注册一个服务工作者时遇到了困难,我打算用它来添加新的应用程序安装横幅功能。我正在按照说明在我的 app.js 文件中添加以下代码,但我注意到没有收到任何注册信号或任何错误。

这是我添加到 app.js:

的代码
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('service-worker.js').then(function(registration) {
    //Registration was successful
    console.log('ServiceWorker registration successful with scope: ', registration.scope);
  }).catch(function(err) {
    //registration failed :(
    console.log('ServiceWorker registration failed: ', err);
  });
}

如果您没有看到任何记录,那么最可能的原因是您 运行 在不支持服务工作者的浏览器中。换句话说,if ('serviceWorker' in navigator) 检查失败。您可以通过在与 if.

关联的 else 子句中添加日志语句来确认这一点

您正在使用哪个浏览器进行测试? Service Workers 将来会在更多浏览器中使用,但截至目前,它们仅在桌面和 Android 平台的 Chrome 当前版本中默认启用。

确保您在 localhost 加载页面,或者您必须使用 https

You’ll also need to serve your code via HTTPS — Service Workers are restricted to running across HTTPS for security reasons. GitHub is therefore a good place to host experiments, as it supports HTTPS.

https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker_API/Using_Service_Workers

检查您的浏览器是否支持此功能。

if ('serviceWorker' in navigator) {
  [...]
} else {
  console.log("this browser does NOT support service worker");
}

这可能有帮助:http://caniuse.com/#feat=serviceworkers

如果您想查看 serviceworker 的当前状态,您可以这样做:

navigator.serviceWorker.register('/serviceworker.js', {scope: '/'})
  .then(function (registration) {
    var serviceWorker;
    if (registration.installing) {
      serviceWorker = registration.installing;
    } else if (registration.waiting) {
      serviceWorker = registration.waiting;
    } else if (registration.active) {
      serviceWorker = registration.active;
    }

    if (serviceWorker) {
      console.log("ServiceWorker phase:", serviceWorker.state);

      serviceWorker.addEventListener('statechange', function (e) {
        console.log("ServiceWorker phase:", e.target.state);
      });
    }
  }).catch(function (err) {
    console.log('ServiceWorker registration failed: ', err);
  });