使用Web Push Notifications提升用户参与度和留存率

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

使用Web Push Notifications提升用户参与度和留存率

使用Web Push Notifications提升用户参与度和留存率

  • 使用Web Push Notifications提升用户参与度和留存率
    • 引言
    • Web Push Notifications的基本概念
      • 什么是Web Push Notifications
      • Web Push Notifications的核心原理
      • Web Push Notifications的优势
    • Web Push Notifications的实现方法
      • 1. 用户订阅
        • HTML 示例
        • JavaScript 示例
      • 2. 服务工作线程(Service Worker)
        • Service Worker 示例
      • 3. 服务器端实现
        • Node.js 示例
    • 实际案例:使用Web Push Notifications提升电商网站的用户参与度
      • 1. 创建HTML结构
      • 2. 编写JavaScript代码
      • 3. 编写服务工作线程代码
      • 4. 编写服务器端代码
      • 5. 测试推送通知
    • 最佳实践
      • 1. 用户权限管理
      • 2. 内容相关性
      • 3. 频率控制
      • 4. 安全性
      • 5. 兼容性
    • 结论
    • 参考资料

引言

在当今竞争激烈的互联网环境中,提高用户参与度和留存率是每个网站和应用的关键目标。Web Push Notifications(网页推送通知)作为一种有效的工具,可以帮助网站和应用在用户未打开页面的情况下向用户发送通知,从而吸引用户回访,提高用户参与度和留存率。本文将详细介绍Web Push Notifications的基本概念、核心原理、实现方法以及一个实际的示例应用。

Web Push Notifications的基本概念

什么是Web Push Notifications

Web Push Notifications 是一种基于浏览器的技术,允许网站在用户未打开页面的情况下向用户发送通知。这些通知可以显示在用户的桌面或移动设备上,类似于原生应用的通知。

Web Push Notifications的核心原理

  1. 订阅:用户同意接收来自某个网站的通知。
  2. 推送服务:浏览器通过一个推送服务(如 Google Firebase Cloud Messaging, FCM)将订阅信息发送到服务器。
  3. 发送通知:服务器通过推送服务向用户发送通知。
  4. 接收通知:浏览器接收到通知后,显示给用户。

Web Push Notifications的优势

  1. 提高用户参与度:通过及时的通知,吸引用户回访网站或应用。
  2. 提高留存率:定期发送有用的信息,保持用户对网站或应用的兴趣。
  3. 无需用户登录:用户只需一次订阅,即可在任何设备上接收通知。
  4. 低开销:推送通知的发送成本较低,适合大规模使用。

Web Push Notifications的实现方法

1. 用户订阅

用户需要先订阅通知,才能接收来自网站的通知。

HTML 示例
<button id="subscribeButton">Subscribe to Notifications</button>
<script src="service-worker.js"></script>
<script src="app.js"></script>
JavaScript 示例
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker registered with scope:', registration.scope);
      initializeUI();
    })
    .catch(error => {
      console.error('Service Worker registration failed:', error);
    });
}

function initializeUI() {
  const button = document.querySelector('#subscribeButton');
  button.addEventListener('click', () => {
    subscribeUser();
  });
}

async function subscribeUser() {
  const registration = await navigator.serviceWorker.getRegistration();
  const subscription = await registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array('YOUR_PUBLIC_VAPID_KEY')
  });
  await sendSubscriptionToServer(subscription);
  console.log('User subscribed:', subscription);
}

function sendSubscriptionToServer(subscription) {
  // 发送订阅信息到服务器
  fetch('/subscribe', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(subscription)
  })
  .then(response => response.json())
  .then(data => {
    console.log('Subscription saved on server:', data);
  })
  .catch(error => {
    console.error('Error sending subscription to server:', error);
  });
}

function urlBase64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);
  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

2. 服务工作线程(Service Worker)

服务工作线程(Service Worker)是Web Push Notifications的核心组件,负责处理推送通知的接收和显示。

Service Worker 示例
self.addEventListener('push', event => {
  const data = event.data.json();
  self.registration.showNotification(data.title, {
    body: data.body,
    icon: data.icon,
    image: data.image,
    badge: data.badge,
    vibrate: data.vibrate,
    tag: data.tag,
    renotify: data.renotify,
    actions: data.actions
  });
});

self.addEventListener('notificationclick', event => {  event.notification.close();
  event.waitUntil(
    clients.matchAll({ type: 'window' }).then(windowClients => {
      let matchingClient = null;
      for (let i = 0; i < windowClients.length; i++) {
        const windowClient = windowClients[i];
        if (windowClient.url === '/' && 'focus' in windowClient) {
          matchingClient = windowClient;
          break;
        }
      }
      if (matchingClient) {
        return matchingClient.focus();
      } else {
        return clients.openWindow('/');
      }
    })
  );
});

3. 服务器端实现

服务器端需要通过推送服务(如 FCM)向用户发送通知。

Node.js 示例
const webpush = require('web-push');

// 设置 VAPID 密钥
webpush.setVapidDetails(
  'mailto:your-email@example.com',
  'YOUR_PUBLIC_VAPID_KEY',
  'YOUR_PRIVATE_VAPID_KEY'
);

// 发送通知
app.post('/send-notification', (req, res) => {  const subscription = req.body.subscription;
  const payload = JSON.stringify({ title: 'New Notification', body: 'This is a test notification' });
  webpush.sendNotification(subscription, payload)
    .then(() => res.status(201).json({ success: true }))
    .catch(err => res.status(500).json({ success: false, error: err }));
});

图示:Web Push Notifications的核心原理及其在提高用户参与度和留存率中的应用

实际案例:使用Web Push Notifications提升电商网站的用户参与度

假设我们有一个电商网站,希望通过Web Push Notifications 提升用户的参与度和留存率。以下是具体的步骤和代码示例:

1. 创建HTML结构

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>E-commerce Website</title>
  <script src="service-worker.js"></script>
  <script src="app.js"></script>
</head>
<body>
  <h1>Welcome to Our E-commerce Website</h1>
  <button id="subscribeButton">Subscribe to Notifications</button>
</body>
</html>

2. 编写JavaScript代码

app.js 文件中编写 JavaScript 代码,实现用户订阅和发送通知的功能。

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker registered with scope:', registration.scope);
      initializeUI();
    })
    .catch(error => {
      console.error('Service Worker registration failed:', error);
    });
}

function initializeUI() {
  const button = document.querySelector('#subscribeButton');
  button.addEventListener('click', () => {
    subscribeUser();
  });
}

async function subscribeUser() {
  const registration = await navigator.serviceWorker.getRegistration();
  const subscription = await registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array('YOUR_PUBLIC_VAPID_KEY')
  });
  await sendSubscriptionToServer(subscription);
  console.log('User subscribed:', subscription);
}

function sendSubscriptionToServer(subscription) {
  // 发送订阅信息到服务器
  fetch('/subscribe', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(subscription)
  })
  .then(response => response.json())
  .then(data => {
    console.log('Subscription saved on server:', data);
  })
  .catch(error => {
    console.error('Error sending subscription to server:', error);
  });
}

function urlBase64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);
  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

3. 编写服务工作线程代码

service-worker.js 文件中编写服务工作线程代码,处理推送通知的接收和显示。

self.addEventListener('push', event => {
  const data = event.data.json();
  self.registration.showNotification(data.title, {
    body: data.body,
    icon: data.icon,
    image: data.image,
    badge: data.badge,
    vibrate: data.vibrate,
    tag: data.tag,
    renotify: data.renotify,
    actions: data.actions
  });
});

self.addEventListener('notificationclick', event => {  event.notification.close();
  event.waitUntil(
    clients.matchAll({ type: 'window' }).then(windowClients => {
      let matchingClient = null;
      for (let i = 0; i < windowClients.length; i++) {
        const windowClient = windowClients[i];
        if (windowClient.url === '/' && 'focus' in windowClient) {
          matchingClient = windowClient;
          break;
        }
      }
      if (matchingClient) {
        return matchingClient.focus();
      } else {
        return clients.openWindow('/');
      }
    })
  );
});

4. 编写服务器端代码

使用 Node.js 和 web-push 库编写服务器端代码,实现发送通知的功能。

const express = require('express');
const bodyParser = require('body-parser');
const webpush = require('web-push');

const app = express();
app.use(bodyParser.json());

// 设置 VAPID 密钥
webpush.setVapidDetails(
  'mailto:your-email@example.com',
  'YOUR_PUBLIC_VAPID_KEY',
  'YOUR_PRIVATE_VAPID_KEY'
);

// 保存订阅信息
app.post('/subscribe', (req, res) => {
  const subscription = req.body;
  // 保存订阅信息到数据库
  res.status(201).json({ success: true });
});

// 发送通知
app.post('/send-notification', (req, res) => {
  const subscription = req.body.subscription;
  const payload = JSON.stringify({ title: 'New Notification', body: 'This is a test notification' });
  webpush.sendNotification(subscription, payload)
    .then(() => res.status(201).json({ success: true }))
    .catch(err => res.status(500).json({ success: false, error: err }));
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

5. 测试推送通知

  1. 启动服务器:
    node server.js
  2. 打开浏览器,访问包含上述 HTML 和 JavaScript 代码的页面。
  3. 点击“Subscribe to Notifications”按钮,订阅通知。
  4. 使用 Postman 或其他工具发送 POST 请求到 /send-notification,测试通知是否成功发送。

图示:使用Web Push Notifications实现电商网站用户参与度提升的具体步骤

最佳实践

1. 用户权限管理

确保用户明确知道他们订阅了哪些通知,并提供取消订阅的选项。

2. 内容相关性

发送的内容应与用户兴趣相关,避免发送无关或垃圾信息。

3. 频率控制

合理控制通知的频率,避免过度打扰用户。

4. 安全性

确保 VAPID 密钥的安全性,防止未经授权的访问。

5. 兼容性

虽然大多数现代浏览器支持 Web Push Notifications,但仍需进行兼容性检测。

if ('serviceWorker' in navigator && 'PushManager' in window) {
  // 使用 Web Push Notifications
} else {
  // 使用其他通知方式
}

结论

Web Push Notifications 是一种强大的工具,可以帮助网站和应用在用户未打开页面的情况下向用户发送通知,从而提高用户参与度和留存率。本文详细介绍了 Web Push Notifications 的基本概念、核心原理、实现方法以及一个实际的示例应用。希望本文能帮助读者更好地理解和应用 Web Push Notifications,构建高质量的网站和应用。

参考资料

  • MDN Web Docs: Using the Notifications API
  • Google Developers: Web Push Notifications
  • Web Push Protocol
  • web-push npm package
  • Firebase Cloud Messaging (FCM)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918916.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

量化选股日常操作日记-11-ai眼镜-润欣科技

用 微信小程序 梦想兔企业智能风险分析助手 &#xff0c;选择AI眼镜板块&#xff0c;挖掘了几个合适的股&#xff0c;分析下来感觉 润欣科技 比较安全些适合观察&#xff0c;几块到十几块波动&#xff0c;企业基本面也没有特别大问题。就是现在价位在周期波动高位&#xff0c;下…

【WPF】Prism学习(五)

Prism Commands 1.错误处理&#xff08;Error Handling&#xff09; Prism 9 为所有的命令&#xff08;包含AsyncDelegateCommand&#xff09;提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…

Intern大模型训练营(八):Llamaindex RAG 实践

1. 基于 LlamaIndex 构建自己的 RAG 知识库 首先在Intern Studio中申请30% A100的开发机。 进入开发机后&#xff0c;创建新的conda环境&#xff0c;命名为 llamaindex&#xff0c;在命令行模式下运行&#xff1a; conda create -n llamaindex python3.10 复制完成后&#…

台式电脑没有声音怎么办?台式电脑没有声音解决详解

台式电脑一般来说都是没有内置扬声器的&#xff0c;需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题&#xff0c;我们也需要确认这些设备硬件有没问题&#xff0c;知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…

vue2项目中在线预览csv文件

简介 希望在项目中&#xff0c;在线预览.csv文件&#xff0c;本以为插件很多&#xff0c;结果都只是支持excel&#xff08;.xls、.xlsx&#xff09;一到.csv就歇菜。。。 关于文件预览 vue-office&#xff1a;文档、 查看在线演示demo&#xff0c;支持docx、.xlsx、pdf、ppt…

H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0c;也能支持WebS…

WordPress设置自动更新CSS版本号

WordPress 通常会在引用 CSS 文件时添加版本号参数&#xff08;?verx.x.x&#xff09;。如果版本号未更新&#xff0c;浏览器可能继续加载旧的文件。 解决方法&#xff1a;确保你在 functions.php 文件中正确加载了 CSS 文件&#xff0c;并动态更新版本号。例如在functions.p…

【Linux】监控系统Zabbix的安装与配置

文章目录 一、前期准备1、安装LAMP2、配置SELinux与防火墙3、测试Apache4、配置数据库5、创建zabbix数据库及应用 二、server端安装配置1、软件包安装2、配置数据库3、zabbix访问测试4、配置web界面 三、Agent端安装配置1、安装zabbix-agent2、配置3、启动zabbix-agent4、配置防…

Springboot基于GIS的旅游信息管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏&#xff0c;但UI元素被限制在安全区内…

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…

SQL复杂数据类型处理

背景 数据处理中&#xff0c;经常碰到复杂数据类型&#xff0c;需要将他们进行解析才能利用。 复杂数据类型 1、MAP结构转为列 WITH tmp AS ( SELECT {"Users":{"4418":{"UserId":4418,"Score":0,"IsStudent":true},&q…

下一代以区域为导向的电子/电气架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

CSS盒子的定位>(上篇)#定位属性#相对定位-附练习

一、定位属性 1.定位方式 position属性可以选择4种不同类型的定位方式。 语法格式&#xff1a;position&#xff1a;relation | absolute | fixed参数&#xff1a;①relative生成相对定位的元素&#xff0c;相对于其正常位置进行定位。 ②absolute生成绝对定位的…

Matlab信号处理:短时傅里叶变换

短时傅里叶变换&#xff08;简称STFT&#xff09;是傅里叶变换在时频域的扩展&#xff0c;它是为分析频域随时间变化的非平稳信号。本文模拟一个啁啾信号&#xff08;一个线性调频的信号&#xff09;&#xff0c;借助matlab的短时傅里叶变换函数stft&#xff0c;分析其时频特性…

Linux网络:基于文件的网络架构

Linux网络&#xff1a;基于文件的网络架构 网络架构TCP全连接队列 网络架构 在Linux中提供了多种系统调用&#xff0c;完成网络操作。比如TCP连接的建立&#xff0c;各种报文的收发等等。但是所有的Linux网络操作&#xff0c;都源于系统调用socket&#xff0c; 在Linux的man手…

【SpringBoot】23 文件预览(kkFileView)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 文件预览功能是指在不打开或编辑文件的情况下&#xff0c;通过某种方式查看文件的内容、格式或者部分内容的功能。该功能通常用于文件管理系统、办公工具、在线教育平台、企业协作平台、电子邮件客户端等领域&#xff0c;能…

Android笔记(三十七):封装一个RecyclerView Item曝光工具——用于埋点上报

背景 项目中首页列表页需要统计每个item的曝光情况&#xff0c;给产品运营提供数据报表分析用户行为&#xff0c;于是封装了一个通用的列表Item曝光工具&#xff0c;方便曝光埋点上报 源码分析 核心就是监听RecyclerView的滚动&#xff0c;在滚动状态为SCROLL_STATE_IDLE的时…

关于Java合并多个Excel中的数据【该数据不是常规列表】,并入库保存的方案

1. 背景 最近在使用RPA&#xff08;机器人流程自动化&#xff09;做数据采集的时候。发现那个RPA采集&#xff0c;一次只能采集相同格式的数据&#xff0c;然后入到Excel或者库中。由于院内系统的业务限制&#xff0c;导致采集的数据是多个Excel&#xff0c;并且我们这边的需求…