可以在局域网中使用android推送通知吗?没有互联网[关闭]

Posted

技术标签:

【中文标题】可以在局域网中使用android推送通知吗?没有互联网[关闭]【英文标题】:Is posible use android push notifications in lan? without internet [closed] 【发布时间】:2019-10-31 09:14:48 【问题描述】:

我的问题是: 我可以在局域网环境中实现android推送通知吗?

有什么建议吗?

谢谢!

【问题讨论】:

问题是您打算如何将设备连接到局域网? 所有设备都用静态IP连接,我把所有这些IP都放在一个数据库里。 你说的是弹出通知的UI方面,还是说android os中的网络推送通知机制? @Todd 问题是是否可以在没有互联网的局域网环境中使用推送通知。仅向应用程序特定用户发送消息。有些情况下有新任务要做。 @wolobi 为清楚起见,您指的是 i)“弹出式用户界面”体验,还是 ii)“通过局域网利用通常基于 Internet 的网络推送通知机制”。我相信你想要 [i]。 【参考方案1】:

没有。如果没有互联网,就无法手动独立于官方操作系统供应商基础设施来刺激操作系统推送通知触发系统。

可能有一种方法可以做到这一点,但采用非标准方式:

欺骗性 DNS 被盗推送通知证书 (手动插入 CA [尽管证书可能已固定在应用程序中]) 根操作系统覆盖

如果没有省电机制,仍然可以与应用通信,但不如“可靠”或“省电”。

解决方法:

让您的应用保持清醒(有一些技术可以做到这一点,但在许多类型的设备上并不总是可靠的);和 您自己的网络通道(TCP 连接、HTTP/TCP 连接、TCP 轮询、HTTP 轮询) 作为备份,用户可以帮助保持应用程序运行。指示器可以提供帮助,向用户显示应用程序是否仍连接到服务器。为了用户的可靠性,您可以在应用即将“停用”时向用户显示通知,以便用户提供帮助并重新激活应用。

“推送通知”和“通知”的命名对很多人来说是模棱两可的。

通知(不带 Push)

defined by Android 是不是

通知是 Android 在您的应用之外显示的消息 界面

这就是@FinnMarquardt 在他们的回答中提供的帮助 - https://***.com/a/58640641/887092

这当然可以在没有任何网络连接的情况下完成。当您的应用程序启动时,您可以显示“应用程序刚刚启动”之类的通知。所以这个概念是指一个App可以使用的UI组件,不涉及网络。

推送通知

“推”这个词有很多含义:

Channel - 由操作系统供应商 (Google) 管理的特定通信渠道;和 触发器 - 操作系统中唤醒您的应用的触发器 不是通知 (UI) - 此机制不显示通知

Channel 很方便,因为您不需要构建它(协议和分发服务器),但您可以自己构建它。

对于 Android 和 FCM,使用持久 TCP/IP 连接 - 请参阅 https://developer.android.com/training/efficient-downloads/regular_updates。 对于 Apple APN,它是相同的,持久连接:https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1。 (您的手机运营商没有以任何特殊方式参与) 因此,每台设备拥有一个持久共享连接比设备上的每个应用拥有一个连接更(功率)效率更高。

触发器方面无法复制。对于整个智能手机来说,省电是非常重要的。它允许应用程序进入睡眠状态,并让操作系统为整个智能手机处理一次这样的机制。对于 Android,请参阅 https://developer.android.com/training/monitoring-device-state/doze-standby,然后记下“在设备空闲时使用 FCM 与您的应用交互”部分

FCM 高优先级消息让您能够可靠地唤醒您的应用以进行访问 网络,即使用户的设备处于打瞌睡状态或应用处于 App 中 待机模式

应用的打盹模式无法自行唤醒。您需要一种操作系统机制来做到这一点,对于 Android,这意味着推送通知 (FCM)。

推送通知机制本身与前面解释的“通知”无关。 “推送通知”可能会触发应用程序显示“通知”,但不一定。例如,它可能会触发应用程序,然后应用程序读取位置 (GPS),并将该数据发送到服务器。

【讨论】:

【参考方案2】:

不是默认的 firebase 服务,因为它们要求您连接到互联网才能接收来自 firebase 的推送。

但是您可以在设备上手动创建推送通知,

 NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, SOME_CHANNEL_ID)
            .setSmallIcon(R.drawable.icon_notif)
            .setColor(getResources().getColor(R.color.primary))
            .setContentTitle(title)
            .setContentText(text)
            .setAutoCancel(true)
            .setStyle(new NotificationCompat.BigTextStyle()
               .bigText(text)
            );

    Intent intent = new Intent(getApplicationContext(), LauncherActivty.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);


    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    notificationBuilder.setContentIntent(pendingIntent);
    NotificationManager notificationManager =  (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(notificationGroup, SOME_NOTIFICATION_ID, notificationBuilder.build());

这将在此设备上创建推送通知(或更新现有设备)

剩下的就是添加设备之间的通信部分,以便在目标设备上触发推送通知创建

例如https://developer.android.com/training/connect-devices-wirelessly/wifi-direct

【讨论】:

你描述的是弹出通知,显示部分。 “推送通知”是指 Google 为 Android 运行并唤醒应用程序的网络功能。这是一种低功耗解决方案,因此应用程序既不必维护与服务器的网络连接,也不必轮询服务器。它可以节省电力。 OP 可能是关于 UI 部分(也有错误),这使得问题和答案一起误导。为了他人的利益,也许需要编辑问题和答案。

以上是关于可以在局域网中使用android推送通知吗?没有互联网[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在虚拟 LAN 上推送通知

使用 Windows Azure 在 Android 上推送通知

Android - 所有 Android 版本都可以接收 Firebase 推送通知吗

Android可以像苹果推送通知一样使用php吗?

推送通知可以代替 web-socket 吗?

推送天蓝色通知中心的通知