You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

elemental2.dom.PushSubscription(v2.25)缺失p256dh和auth密钥,如何获取?

获取elemental2.dom.PushSubscription的p256dh和auth密钥

我之前也碰到过这个版本的elemental2没有封装p256dh和auth属性的问题,给你两个实用的解决方案:

方案1:通过JS互操作直接访问底层属性

早期版本的elemental2-dom(比如v2.25)确实没在PushSubscription类里暴露这两个密钥属性,但它们其实已经存在于底层的JavaScript对象中。你可以用Jsinterop的工具类直接获取:

import jsinterop.base.Js;
import elemental2.dom.PushSubscription;

// 假设你已经通过Service Worker拿到了subscription实例
PushSubscription subscription = ...;

// 获取p256dh密钥
String p256dh = Js.asPropertyMap(subscription).get("p256dh").asString();

// 获取auth密钥
String auth = Js.asPropertyMap(subscription).get("auth").asString();

如果后续需要把这些base64编码的密钥转换成Uint8Array(用于推送消息的加密处理),可以这样处理:

import jsinterop.base.Js;
import elemental2.core.Uint8Array;

// 转换p256dh为Uint8Array
String p256dhBase64 = Js.asPropertyMap(subscription).get("p256dh").asString();
Uint8Array p256dhBytes = Js.uncheckedCast(Js.global).atob(p256dhBase64)
        .split("")
        .map(c -> c.charCodeAt(0));

// 转换auth为Uint8Array
String authBase64 = Js.asPropertyMap(subscription).get("auth").asString();
Uint8Array authBytes = Js.uncheckedCast(Js.global).atob(authBase64)
        .split("")
        .map(c -> c.charCodeAt(0));

方案2:升级elemental2-dom版本

elemental2后续的版本(比如v2.3.0及以上)已经在PushSubscription类中添加了getP256dh()和getAuth()方法,升级依赖后就能直接调用封装好的方法:

如果使用Maven,更新pom.xml中的依赖:

<dependency>
    <groupId>com.google.elemental2</groupId>
    <artifactId>elemental2-dom</artifactId>
    <version>2.3.0</version> <!-- 推荐使用最新稳定版 -->
</dependency>

升级后代码会更简洁规范:

// 直接调用封装方法获取密钥
String p256dh = subscription.getP256dh();
String auth = subscription.getAuth();

两种方案都能解决你的问题——如果不想改动项目依赖,方案1是最直接的选择;如果项目允许升级依赖,方案2的代码会更易维护。

内容的提问来源于stack exchange,提问作者philwq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:42:11