Web应用中如何获取设备ID以通过FCM发送推送通知?
Web应用通过FCM接收通知时获取设备/浏览器唯一标识的方法
在Web环境中,并没有像安卓系统那样官方提供的固定deviceId,但可以通过以下几种方式获取适配FCM推送场景的唯一标识:
1. 使用FCM推送令牌(Push Token)作为核心标识
这是Web推送场景下最适配的“设备/会话唯一标识”,FCM会为每个授权的浏览器实例生成唯一令牌,后端可直接用它定向发送通知。
- 获取流程:
- 先请求用户的通知权限:
const permission = await Notification.requestPermission(); - 权限通过后,调用FCM SDK的
getToken()方法获取令牌:import { getToken } from "firebase/messaging"; import { messaging } from "./firebase-init"; // 已初始化的FCM实例 async function fetchFCMPushToken() { if (await Notification.requestPermission() === "granted") { const token = await getToken(messaging, { vapidKey: "你的VAPID公钥" }); if (token) { // 将令牌发送到后端存储 console.log("FCM推送令牌:", token); } } }
- 先请求用户的通知权限:
- 注意:令牌可能因用户清除浏览器数据、更换浏览器、重新授权通知等情况变更,后端需实现令牌的更新与失效处理逻辑。
2. 浏览器指纹作为补充标识
若需要更偏向设备级的标识(无绝对永久唯一),可生成浏览器指纹,需注意隐私合规(如GDPR):
- 可结合浏览器UA、屏幕分辨率、时区、语言、硬件核心数等信息,哈希后生成指纹:
async function generateBrowserFingerprint() { const fingerprintElements = [ navigator.userAgent, navigator.language, `${screen.width}x${screen.height}`, Intl.DateTimeFormat().resolvedOptions().timeZone, navigator.hardwareConcurrency ].join("|"); const hashBuffer = await crypto.subtle.digest( "SHA-256", new TextEncoder().encode(fingerprintElements) ); return Array.from(new Uint8Array(hashBuffer)) .map(b => b.toString(16).padStart(2, "0")) .join(""); } - 注意:指纹并非绝对唯一,设备设置或浏览器版本更新可能改变指纹,且需确保用户知晓数据收集行为。
3. 绑定用户身份标识(推荐)
如果Web应用有用户登录系统,将FCM令牌与用户ID绑定是最可靠的方案:
- 用户登录后,将当前FCM令牌与用户ID一同发送到后端,后端维护「用户ID - 推送令牌」的映射关系;
- 发送通知时,通过用户ID匹配对应的令牌,即使令牌变更,也可通过用户身份关联最新令牌。
内容的提问来源于stack exchange,提问作者amir tbi
相关产品推荐
相关产品推荐

