【问题标题】:Google Cloud Messaging not working on 4.1.2 devices on a corporate networkGoogle Cloud Messaging 无法在公司网络上的 4.1.2 设备上运行
【发布时间】:2014-05-19 08:04:31
【问题描述】:

我已经实现了一个简单的 GCM 客户端和服务器。客户端使用current GCM client APIs(不是deprecated helper library)。服务器(C# & .NET)遵循相应的server guidelines(使用HTTP)。我的服务器在我公司域内的机器上运行,因此我将客户端设备连接到公司网络内的 Wi-Fi 接入点,但可以访问 Internet。

简而言之,我的问题是在 4.3+ 手机上可以正常接收通知,但在连接到公司 Wi-Fi 网络时在 4.1.2 手机上永远不会收到通知。如果我将 4.1.2 设备连接到我们的公共访客 Wi-Fi 网络,则会按预期接收 GCM 消息,但是应用程序无法连接到公司服务器。

我看到一些迹象表明,当公司网络的防火墙保护过度(例如here)时,GCM 可能会失败。但如果只是防火墙的问题,4.3+的设备肯定也不会收到任何消息吗?

一些额外的细节

我的测试手机如下:

  • 华硕 Nexus 7 (4.4.2)
  • 三星 Galaxy S4 (4.4.2)
  • HTC One (4.3)
  • 三星 Galaxy S3 (4.1.2)
  • 摩托罗拉 Razr HD (4.1.2)

服务器已收到来自所有五台设备的有效注册 ID。在一个 15 秒的计时器上,它会向所有五个注册 IDS 发送一条消息。响应始终显示发送了 5 条消息,没有错误,也没有更改注册 ID。但是,在上面列出的前三个设备上总是收到,而在后两个设备上从不(运行 4.1.2)。当我调试它们时,广播接收器根本没有被调用。

我还验证了所有五台设备:

  • 拥有 Google Play Services 4.3.25
  • 没有 SIM 卡,因此没有蜂窝数据,并且在同一个 WiFi 网络上
  • 有正确的日期和时间
  • 使用同一个 Gmail 测试帐户注册
  • 正在运行我的客户端应用程序的相同版本
  • 为其 Google 帐户启用所有同步设置

【问题讨论】:

  • 您能否在问题中发布您的清单?
  • @Eran 当然,我已经添加了。
  • 刚刚添加了 build.gradle 以防万一有用。
  • 好吧,我觉得清单中的 GCM 相关定义没问题,所以我不能帮你。
  • 尝试在一个不工作的设备上安装Firebind,并用它来检查端口5228,5229,5230是否打开。

标签: android networking google-cloud-messaging


【解决方案1】:

我终于弄清楚了问题所在。公司防火墙正在阻止本机 GCM 端口 5228 上的流量。(5229 和 5230 是 also mentioned with relation to GCM 但我们根本没有看到这些端口上的任何尝试流量。)这在其他地方有很好的记录(只是 Google GCM 端口 5228)。

我在任何地方都找不到明确的记录,但我们从服务器日志和在手机上运行 Connection Tracker 发现,较新版本的 Android 回退到使用端口 443(标准 HTTPS 端口) 大多数防火墙默认允许流量通过。这就是我们运行较新 Android 版本的设备即使在防火墙后面也能正常工作的方式。我不确切知道哪个 Android 版本引入了这个 443 端口回退,但它介于 4.1.2(不工作)和 4.3(工作)之间。

【讨论】:

    【解决方案2】:

    我没有看到上面的清单条目,但我几天前遇到了确切的问题,清单 package 必须匹配 C2D_MESSAGE 权限包。 即。

        <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.foo.bar"
        android:versionCode="8"
        android:versionName="3.1">
    

    ...

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <permission android:name="com.foo.bar.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.foo.bar.permission.C2D_MESSAGE" />
    

    在我的情况下,声明的包不匹配,以便为以前版本的应用程序提供升级路径。

    【讨论】:

    • 在发现不是问题后,我删除了清单:仅当解决方案连接到公司网络时才会出现问题。清单很好,包确实匹配 C2D_MESSAGE 权限。如果您有兴趣,您仍然可以在revisions to this page 中查看清单。
    • 查看修订,发现接收器没有导出,可能值得一试:developer.android.com/reference/com/google/android/gms/gcm/… 告诉我它是否有效,我会更新答案。
    • 接收器已导出!不知道为什么你认为它不是。另外,请在进一步评论之前再次阅读问题和我的 cmets:清单不是问题。
    猜你喜欢
    • 2023-02-24
    • 2020-07-08
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2020-01-13
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多