如何重置window.launchQueue?解决Angular PWA重载重复触发问题
解决Angular PWA中launchQueue重复消费tel链接参数的问题
核心解决方案:标记已处理参数
利用sessionStorage记录已处理过的启动参数标识,每次消费前先检查该参数是否已被处理,仅在未处理时执行呼叫逻辑,避免页面重载后重复触发操作。
sessionStorage的特性适配场景:页面重载时数据会保留,但用户关闭并重新打开应用时数据会清空,既避免重载重复执行,又不影响新启动时正常处理tel链接。
修改后的代码实现
ngOnInit() { if ("launchQueue" in window && typeof window.launchQueue === 'object' && 'setConsumer' in window.launchQueue && typeof window.launchQueue.setConsumer === 'function') { window.launchQueue.setConsumer((launchParams) => { if (launchParams.targetURL && launchParams.targetURL.includes('call/?number=tel')) { // 生成参数唯一标识,用base64编码避免特殊字符冲突 const processedKey = `tel_link_processed_${btoa(launchParams.targetURL)}`; // 检查是否已处理过该参数 if (!sessionStorage.getItem(processedKey)) { const link = new URL(launchParams.targetURL).searchParams.get('number'); const number = link?.split(':')[1]; if (number) { this.handleTelLink(number); // 标记为已处理 sessionStorage.setItem(processedKey, '1'); } } } }); } }
补充说明
- 若需要跨浏览器会话保留已处理记录(不推荐,可能导致用户无法重新触发同一号码的呼叫),可将
sessionStorage替换为localStorage。 - 增加了
link和number的空值判断,避免因参数异常引发的报错。
内容的提问来源于stack exchange,提问作者noBeansChili
相关产品推荐
相关产品推荐

