我有一个Java Web应用程序,需要向用户发送手动和自动通知。 此通知应转到用户的浏览器以及移动设备(iOS和Android)。 我发现如果移动设备上没有运行本机应用程序,则无法直接向移动设备发送通知。所以我唯一的选择似乎是网络推送通知。我浏览了几篇文章,发现它非常令人困惑。我不知道从哪里开始。
- 我可以直接从 Java 代码发送通知吗?还是我必须使用FCM(Firebse)?如果是这样,我可以直接从Java代码调用FCM,例如使用Apache http客户端库调用它吗?
- FCM、客户端浏览器和我的应用程序如何连接?
- 我还发现服务工作者应该在后台运行以接收通知。如何将其与 Java 代码集成?
您可以在不使用 FCM 的情况下直接发送它们,并且有几个可用的库,包括一个 Java 库。
不幸的是,iOS目前不支持Web Push。您的服务的订阅是在设备级别而不是按用户进行的,因此,如果我在桌面上注册,除非我在移动浏览器中再次注册,否则您无法向我的手机发送通知。
如果浏览器的实例正在运行,则推送到 Android 的通知将显示,在现实世界中(无论如何对我来说),Chrome 似乎总是在后台的某个地方运行,所以我几乎实时收到通知。缺点是网络推送通知直接进入通知栏,它们不会首先在屏幕上弹出。
粗略的工作流程是这样的:
-
用户访问您的页面,您加载服务工作者并检查 Web 推送 功能,如果满意,您可以请求发送权限 通知。
-
如果用户授予权限,则将公钥传递给您的服务 worker 为该用户创建订阅,这将返回一个 端点和两个密钥,您需要向它们推送通知。
- 您的 webpush 库作为服务器实例运行并负责所有 加密和令牌处理,您可以随心所欲地配置 调度消息,通常是为了响应 HTTP POST 请求,但 这取决于你。
- 在服务工作线程中,定义用于接收 推送消息。这是创建和显示通知的位置 对于用户来说,你如何做到这一点同样取决于你。
您可以在通知的有效负载中传递参数,并将它们用作您显示的通知中的变量,也可以对值进行硬编码,您可以根据用户是否关注您的页面指定不同的行为,您可以添加按钮并为它们设置不同的操作,在关闭时触发事件, 自定义振动模式,替换或堆叠通知,访问现有通知中的数据等。所有这些都由您的服务工作者处理,仅接收通知没有任何作用。
您的服务工作者只是一个用 javascript 编写的脚本,您可以从页面链接它。它在用户首次访问时由浏览器加载和安装,然后在调用时独立运行。
服务人员非常强大。您还可以使用它们来实现复杂的缓存规则,在离线时提供内容,在不同的浏览器窗口之间推送数据等。服务工作线程可以生成更多的服务工作线程,并且由于它们在浏览器的主线程之外运行,因此非常适合卸载 CPU 密集型任务,而不会延迟页面的呈现。
最后要注意的是,您的站点必须通过 SSL 提供服务才能部署服务辅助角色。
1)这有点取决于发送消息的Java代码的运行位置。
- 如果它在Android设备中运行,则无法安全地从该代码发送消息。有关更多详细信息,请参阅此处的答案:如何使用Firebase消息传递发送一对一消息
- 如果代码在您控制的环境中运行(例如您控制的服务器或云函数),则可以调用此处记录的 FCM HTTP 端点。Java Admin SDK尚不支持发送消息,尽管它似乎正在考虑中。