获取 PushManager 订阅时出错 - JavaScript

2023-12-27

我有以下代码,用于注册服务工作人员并要求用户允许通知。在用户允许推送通知(其中承诺返回)后,我收到错误serviceWorkerRegistration.pushManager.getSubscription() is null。当我关闭浏览器并再次强制调用此函数时,它可以正常工作,不会出现错误。我不明白为什么。这是我的代码:

window.vapidPublicKey = new Uint8Array([4, 45, ...]); 
if (navigator.serviceWorker) {
  navigator.serviceWorker.register('/serviceworker.js')
  .then(function(reg) {
     console.log('Service worker change, registered the service worker');
  });
}
// Otherwise, no push notifications :(
else {
  console.error('Service worker is not supported in this browser');
}

navigator.serviceWorker.ready.then((serviceWorkerRegistration) => {
  console.log("ready");
  serviceWorkerRegistration.pushManager
  .subscribe({
    userVisibleOnly: true,
    applicationServerKey: window.vapidPublicKey
  });
});



// application.js

// Let's check if the browser supports notifications
if (!("Notification" in window)) {
  console.error("This browser does not support notifications.");
}

// Let's check whether notification permissions have already been granted
else if (Notification.permission === "granted") {
  console.log("Permission to receive notifications has been granted");
}

// Otherwise, we need to ask the user for permission
else if (Notification.permission !== 'denied') {
  Notification.requestPermission(function (permission) {
    // If the user accepts, let's create a notification
    if (permission === "granted") {
      console.log("Permission to receive notifications has been granted");
      saveSubscriptionToDatabase();
    }
  });
}

function saveSubscriptionToDatabase(){

      navigator.serviceWorker.ready
      .then((serviceWorkerRegistration) => {
        console.log(serviceWorkerRegistration.pushManager.getSubscription());
        serviceWorkerRegistration.pushManager.getSubscription()
        .then((subscription) => {
          $.post("/users/save_subscription", { subscription: subscription.toJSON() });
        });
      });

}

错误:

Uncaught (in promise) TypeError: Cannot read property 'toJSON' of null
at serviceWorkerRegistration.pushManager.getSubscription.then

UPDATE:

所以我添加了以下按钮:

 <input type="button" onclick="saveSubscriptionToDatabase();" value="test">

只要我从按钮单击调用该函数,所有 JS 和 post 请求都会按预期工作,但是当我从检查权限状态的条件调用它时,它仍然像以前一样失败。

更新2:

我尝试再次编写代码,但从不同的角度。

function registerServiceWorker() {
  return navigator.serviceWorker.register('serviceworker.js')
  .then(function(registration) {
    console.log('Service worker successfully registered.');
    return registration;
  })
  .catch(function(err) {
    console.error('Unable to register service worker.', err);
  });
}


function askPermission() {
  return new Promise(function(resolve, reject) {
    const permissionResult = Notification.requestPermission(function(result) {
      resolve(result);
    });

    if (permissionResult) {
      permissionResult.then(resolve, reject);
    }
  })
  .then(function(permissionResult) {
    if (permissionResult !== 'granted') {
      throw new Error('We weren\'t granted permission.');
    }
  });
}


function subscribeUserToPush() {
  return navigator.serviceWorker.register('serviceworker.js')
  .then(function(registration) {
    const subscribeOptions = {
      userVisibleOnly: true,
      applicationServerKey: new Uint8Array("key goes here")

    };

    return registration.pushManager.subscribe(subscribeOptions);
  })
  .then(function(pushSubscription) {
    console.log("never called");
    console.log('Received PushSubscription: ', JSON.stringify(pushSubscription));
    return pushSubscription;
  });
}

registerServiceWorker();
askPermission();
subscribeUserToPush();

命令链的最后一部分subscribeUserToPush()我在哪里console.log("never called");永远不会执行并且没有错误。我正在 Chrome 67 中对此进行测试。我确信registration.pushManager.subscribe(subscribeOptions);叫做。


因此,经过几个小时的尝试不同的事情后,我终于解决了问题,而且它非常简单。所以每次你打电话navigator.serviceWorker.register('serviceworker.js')你必须放一个/文件名之前。服务人员无需注册即可正常注册/但抢订阅会失败。您在文档中找到的示例不包括/.

所以,代码应该是这样的:

navigator.serviceWorker.register('/serviceworker.js')

田田现在可以了......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 PushManager 订阅时出错 - JavaScript 的相关文章

随机推荐

  • 如何更正 Subversion 项目中省略主干的地方?

    我有一个颠覆项目 名为 inboundem 这是我的第一个 当我创建它时 我省略了 trunk 我需要将其放入正确的结构中 如 inboundem trunk 我有另一个类似的项目 但由于没有修改 所以我做了svn delete进而svn
  • 使用 LINQ 查询对内部中继器进行排序

    我试图列出一组关联 每个关联内都有一个分配给该关联的 小部件 该列表将包括关联名称和分配给它的任何小部件 问题是内部小部件列表需要按 DisplaySequence 排序 EDMX Model Below 简化的中继器标记
  • 在 xml 属性之间保留新行 C#

    我有一个由用户输入的 XML 我必须向其中添加一些属性 然后将更改后的 XML 作为字符串返回 现在的问题是 它忽略属性之间的退格键 这是我正在谈论的一个例子 我得到的XML
  • Java 安全类强制转换异常

    您好 我是 Java 安全初学者 在调用时遇到以下问题 Cipher cipher Cipher getInstance RSA ECB PKCS1Padding 我收到错误 java lang ClassCastException com
  • 何时使用静态字符串与#define

    我对什么时候最好使用有点困惑 static NSString AppQuitGracefullyKey AppQuitGracefully 代替 define AppQuitGracefullyKey AppQuitGracefully 我
  • 什么是高级模块和低级模块?

    我知道这是以下链接的完全相同的副本 什么是 高级模块 和 低级模块 在依赖倒置原则的背景下 https stackoverflow com questions 3780388 what are high level modules and
  • 更新核心数据对象 swift 3

    我想更新 swift 3 中的核心数据对象 经过一番谷歌搜索后 我没有找到任何有关 swift 3 的信息 所以我的问题是 如何更新 swift 3 中的核心数据对象 使用带有谓词的获取请求来获取现有值 在谓词中使用唯一值 获取对象后 使用
  • Java GUI 自动调整大小

    这里是绘制 GUI 的地方 注意 该类扩展了 JFrame public Cache SubstanceColorChooserUI col new SubstanceColorChooserUI while mode 0 setResiz
  • 在 shell 到 Docker 容器后如何编辑文件?

    我成功地使用以下命令对 Docker 容器进行了 shell 处理 docker exec i t 69f1711a205e bash 现在我需要编辑文件 但里面没有任何编辑器 root 69f1711a205e nano bash nan
  • Alamofire 4 Swift 3 参数编码自定义

    我将我的项目更新为 Swift 3 和 Alamofire 4 我使用的是自定义编码 但它更改为其他编码方法 我无法找到替代方案 等效方案 alamoFire request urlString method HTTPMethod post
  • 如何在 Windows 上的 Git Gui 或 Gitk 中撤消硬重置?

    我在 Windows 上使用 Git Gui 和 Gitk 如何撤消过去两小时内的硬重置 是否可以在不使用命令行的情况下从这些应用程序执行此操作 I saw 这个帖子 https stackoverflow com questions 54
  • 一起记录 Firefox/jQuery/CSS 动画的错误吗?

    我正在编写一个使用 jquery 切换 CSS 类的网站 这些类运行 CSS 动画 在 Google Chrome 和 Internet Explorer 9 10 中 一切正常 在 Firefox Aurora 24 和 Firefox
  • 具有多个客户端的 Azure APIM 和 oAuth 2.0

    我发现很难理解如何使用 oAuth 2 0 区分多个客户端应用程序 使用 APIM 我将后端 Web 服务映射到 Azure API 网关服务 URL 我已将 Oauth 2 0 配置为授予类型作为客户端凭据 因为它是服务到服务集成 在 O
  • 如何在 FDT 内导航/更新 Haxe SDK?

    在 OSX 上 FDT 在此处提供 Haxe SDK Applications FDT 5 app Contents FDT5 haxe haxe 2 09 osx 因为它位于 OSX 包内部 所以我无法导航到它 我如何 在首选项中选择它
  • 为什么 splitViewController:collapseSecondaryViewController:ontoPrimaryViewController: 在 iPhone 6 Plus 上没有被调用?

    我实现了子类UISplitViewController在我的应用程序中 iPhone and iPad 当我旋转设备时 会调用标题中提到的方法Landscape to Portrait方向 除非我在 iPhone 6 Plus 上运行该应用
  • Azure PowerShell - 提取 Azure SQL 数据库信息

    我正在寻找一种方法来提取有关 Azure SQL 数据库的特定信息 已用空间 分配空间和最大存储大小 我知道可以从 Azure 门户获取该信息 但我想使用 PowerShell 来提取它 我已设法使用下面的命令提取一点信息 最大存储大小 但
  • 6000端口有什么特别之处?

    启动你的 Mac 从以下位置获取基本 Flask 应用程序快速启动页面 http flask pocoo org docs 0 10 quickstart 并将端口更改为 6000 这将为您提供以下内容 from flask import
  • 动态 jQuery 变量名

    我想获取 li ID 属性的值 这将是一个 userID 并将其用作字符串的一部分 我最终将使用该字符串作为变量名称的一部分 我将使用这个变量名来创建一个数组 我了解基础知识 但似乎无法找到 jQuery javascript 的正确组合来
  • 将 JavaMail 与自签名证书结合使用

    我有一个包含以下代码的 servlet System setProperty javax net ssl keyStore getServletContext getRealPath keystore jks System setPrope
  • 获取 PushManager 订阅时出错 - JavaScript

    我有以下代码 用于注册服务工作人员并要求用户允许通知 在用户允许推送通知 其中承诺返回 后 我收到错误serviceWorkerRegistration pushManager getSubscription is null 当我关闭浏览器