创建我自己的推送通知服务没有 fcm , pusher ,

Moh*_*ini 11 sdk android notificationservices push-notification

我想创建一个不基于 Google 服务或类似服务的通知系统提供程序。事实上,我想获得有关其整体架构和所需的 Android sdk功能的信息。

对我来说最奇怪的一点是了解如何向 Android 设备发送通知。

我的意思是,我如何从互联网上数以百万计的其他 Android 设备中识别安装了我的应用程序的 Android 设备?

以及如何向他发送信息?我应该为此或类似的东西使用套接字吗?

ash*_*deh 8

简单的答案:你不能

首先我要纠正你的问题,pusher 和 FCM 根本不属于同一组!你可以构建像 Pusher 或 oneSignal 之类的东西,但你不能构建像 FCM/APNS 这样的东西

你应该明白下面三个简单但重要的句子:

  1. 当您想要从place_1(例如 api)提取任何内容到place_2(例如 browser_client)时,您最有一个 place_1_resource 的标识符(通常是 api 的统一资源定位器)
  2. 当您想将任何内容从place_1(例如 notification_central_server)推送到place_2(cellphone_client)时,您最有一个 place_2_resource 的标识符
  3. 您必须知道真正的服务器推送类似服务器推送的技术(例如长拉或...)之间的区别,并且您应该意识到这个概念的目的是真正的服务器推送,而不是任何类型的拉动和推送夹克!

如果您没有任何想要向其发送通知的手机标识符,则您的服务器不知道将该通知发送到哪里,因此我们需要一个类似于手机的资源标识符,它实际上是一个类似设备令牌的资源,您只有一种方法来获取此信息device_token_like,即 FCM/APNS

FCM 就像一个 dns 服务器,包含 google 支持的每个 Android 设备(几乎每个 Android 设备)的所有标识符,APNS 是相同的,但适用于 Apple 设备

注意1:即使您的应用程序可以获得其对应的设备device_token_like,如果它没有在FCM/APNS上注册,也不能用于推送通知

因此,当您获得所需 clinet_device 的 device_token_like 标识符时,您现在可以使用不同的方法将某些内容发送到该 clinet_device。有几种方法,如 SSE、Webpush、HTTP_server_push、Pushlet 等,但这些设备的 mother_companies 都不支持这些方法,唯一完全支持和标准的方法与 FCM/APNS 官方网站建议的方法相同

例如,由于美国制裁,一家名为najva的伊朗公司使用 webpush 发送通知,但 webPush 方法在浏览器和 Android 设备上运行良好,但它们甚至没有出现在苹果设备上

最后我应该说,我钦佩你的好奇心,在你的开发中减少使用基于福利的公司(如 FCM/APNS)的任何东西,但我强烈推荐这些文章和书籍给你,因为我认为你学得还不够:

  1. 推送技术维基百科
  2. 一些人试图制作自己的推送通知服务的故事
  3. 推送技术完整指南 - 2020 版
  4. 使用 HTML5 SSE 的数据推送应用程序


小智 5

简短、直接的回答

你不能(至少在你创建自己的 ROM 之前)

TL;DR,原因是什么?

在构建自己的推送通知服务器之前,您首先需要了解它在 android 内部是如何工作的。每当您/您的服务器向 Android 客户端发送推送通知消息时,SDK 都会对其进行处理并向您显示通知。但是,当您的应用程序未运行(或被杀死)时,您的应用程序无法响应它,因为它没有运行。在这种情况下,您的通知消息将发送到称为Google Play 服务的系统服务。为此,您首先需要将您的应用程序与Google Play 服务绑定,这就是FCM 所做的。FCM SDK 会在第一次初始化时将您的应用程序注册到操作系统服务。该 FCM 服务向一个端口开放,该端口侦听来自服务器的传入消息,当它收到消息时,它会代表您的应用程序发布包含PendingIntent数据的通知。然后,PendingIntent当用户单击它时,将其传递到您的应用程序,最后您的应用程序处理数据(或推送消息)

所以基本上,为了让您的服务器与客户端通信,它首先需要与FCM 服务通信,为此,FCM 会为您提供一个令牌,该令牌标识要向内部Google Play 服务注册的应用程序。

进一步简化,工作流程如下:-

  • 服务器发送push message---> FCM---> Google play service,
    • 如果你的应用程序正在运行,它是由客户端SDK直接处理的,所以,Google play service-->Your app
    • 如果没有,那么它是由服务本身使用PendingIntentSo, Google play service--> PendingIntent--->|传递的 发布通知

完全不可能,有解决办法吗?

没有什么是不可能的,因为不存在绝对的不可能。说不可能通常意味着几乎不可能。(这类似于数学,我们也说趋于无穷大,因为还没有人实现它)。

为了使其工作,您需要以某种方式将您的应用程序绑定到Google Play 服务,但您不能这样做,因为 Google 尚未公开任何直接的 API 来执行此操作。唯一可能的方法是使用 FCM ;-)(运气又不好)。因此,唯一可能的方法是使用自定义推送服务构建您自己的自定义 ROM,该服务充当推送服务器的客户端和推送客户端(即您的应用程序)的服务器。

由于上述选项往往是不可能的,因此您必须选择一种解决方法。

最差的解决方法中最好的方法是:-
  1. 制作恶意SDK。WebSocket恶意的,因为它需要通过连接到服务器端点的服务使应用程序在后台运行。(在新的 Android 版本中更难)。
  2. 利用保存推送通知的数据库,并且您的应用程序使用 定期检查它AlarmManager

希望你明白了。