Firebase 云消息传递 (FCM) 通知在代理后面的设备上不起作用。有没有其他方法可以解决它?

Posted

技术标签:

【中文标题】Firebase 云消息传递 (FCM) 通知在代理后面的设备上不起作用。有没有其他方法可以解决它?【英文标题】:Firebase Cloud Messaging (FCM) notifications doesn't work on devices behind proxy. Is there any alternative way to solve it? 【发布时间】:2017-05-13 16:14:01 【问题描述】:

我们的 android 应用程序正在现场运行超过 2000 台设备。这是一个企业应用程序,未在 Google Play 上发布,我们正在通过这些设备管理我们的运营。对我们来说最重要的一点:我们所有的客户端 Android 设备都在代理之后。 (我们已经对有关“如果您的组织有防火墙...”的 Firebase 文档警告采取了所有措施)

我们正在测试使 FCM 适应我们的应用以接收通知。我们正在使用 HTTP 协议,将 Post 请求发送到https://fcm.googleapis.com/fcm/send URL 地址,因此我们的选择是下游 HTTP 消息 (JSON),我们通过 Postman 和我们的 .Net 桌面应用程序发送数据消息。当设备通过独立 WiFi 连接到 Internet 时,Firebase 云消息传递通知会成功运行。当设备通过移动网络运营商 SIM 卡(无代理)连接到 Internet 时,它也可以成功运行。但是这些方法对我们来说不是解决方案,因为我们所有的设备都在代理后面工作。

Firebase 云消息传递通知是否无法在代理后面的设备上运行?我发现了一些关于 FCM 和代理设备背后的坏消息,但我不确定。我们想使用 FCM 通知,但是 3rd 方额外的应用程序对我们来说不是一个好的解决方案。因为我们在现场管理的设备太多,而且我们也存在安全问题。有没有其他解决方案来解决这个关于代理的问题?

【问题讨论】:

【参考方案1】:

我已收到 Firebase 支持团队关于此问题的答复。答案如下:

请注意,FCM 目前不支持代理,但是我们 会注意到这一点,我们可以考虑向前推进。一世 不能给你一个明确的时间表,请放心 反馈已被确认。我们一直致力于提供 开发人员更友好的体验,因此您的投入很大 赞赏。

我们已经与我们的应用开发和网络团队就这个代理问题花费了一些精力和时间。请注意,FCM 目前不支持代理。我希望他们以后可以支持 Proxy,因为 FCM 有很多好处。

【讨论】:

您的回答已经过去了一段时间,所以我就此寻求支持。他们确认了这个问题,甚至在答案中通过了我这篇文章,所以遗憾的是仍然不可能【参考方案2】:

如果您采取了if your organization has a firewall 中描述的操作 那么设备应该能够接收到消息。https://firebase.google.com/docs/cloud-messaging/server#response

请注意,这些操作必须在设备连接的网络中执行,而不是在发送通知的网络中。

【讨论】:

你好迭戈。谢谢您的回答。我们在设备连接的网络中采取了行动。 Firebase 文档讲述了防火墙,但没有讲述任何关于代理的内容。我们的问题是代理。 Ït 在没有代理的情况下在防火墙后面工作。说代理后面的设备无法接收 Firebase 通知是真的吗? FCM 需要能够通过直接连接(无代理)在端口 443、5228、5229 和 5230 上连接到 Google 服务器。如果这不可能,设备将无法接收通知。【参考方案3】:

请注意,截至 2019 年,Firebase 有一些代理支持,至少使用 Java 或 Node.js,请参阅这篇文章:https://medium.com/faun/firebase-accessing-firestore-and-firebase-through-a-proxy-server-c6c6029cddb1

如果链接断开,这是一个 Java 配置示例,所有功劳归于编写此教程的 Hiranya Jayathilaka(非常感谢!)

String myProxyHost = "localhost"; // REPLACE
int myProxyPort = 3128; // REPLACE

InetSocketAddress address = new InetSocketAddress(myProxyHost, myProxyPort);
HttpTransport transport = new NetHttpTransport.Builder()
        .setProxy(new Proxy(Proxy.Type.HTTP, address))
        .build();

FirebaseOptions.Builder builder = new FirebaseOptions.Builder();
builder.setHttpTransport(transport);
// ... further configuration ...

加法:

我已尝试此解决方案并将 HttpTransport 仅代理请求设置为“fcm.googleapis.com”,这在我的情况下是不够的,因为 Firebase Sdk 首先从“accounts.google.com”检索授权令牌。

要代理对“accounts.google.com”的请求,我必须像这样使用系统属性:

System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", String.valueOf(proxyPort));            
System.setProperty("com.google.api.client.should_use_proxy", "true");

【讨论】:

"setHttpTransport" 仅存在于 admin sdk 中,但我在这里看到 ***.com/questions/47581505/… 它在 android 中不支持

以上是关于Firebase 云消息传递 (FCM) 通知在代理后面的设备上不起作用。有没有其他方法可以解决它?的主要内容,如果未能解决你的问题,请参考以下文章

FCM(Firebase 云消息传递):Firebase 推送通知在 Firefox 中显示,但在 Chrome 中不显示

如何在 Xamarin.iOS 中使用 FCM(Firebase 云消息传递)发送 iOS 推送通知

使用 PhoneGap 和 Firebase 云消息传递 (FCM) 的简单推送通知 Android 应用程序

如何在 Firebase 云消息传递 (FCM) 中使用深度链接

Firebase 云消息传递 (FCM) 通知在代理后面的设备上不起作用。有没有其他方法可以解决它?

如何使用 Firebase 云消息传递和 Liferay 推送通知