我已经实现了一个简单的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消息,但该应用无法连接到公司服务器。
我已经看到一些迹象表明,当公司网络具有过度保护的防火墙时,GCM可能会失败(例如here)。但如果它只是一个防火墙问题,那么4.3 +设备肯定不会收到任何消息吗?
我的测试手机如下:
服务器已从所有五个设备收到有效的注册ID。在一个15秒的计时器上,它发出一条发往所有五个注册IDS的消息。响应始终显示发送了5条消息,没有错误,也没有更改注册ID。但是,上面列出的前三个设备始终,最后两个从不(运行4.1.2)。当我调试它们时,广播接收器根本没有被调用。
我还验证了所有五种设备:
答案 0 :(得分:13)
我终于弄明白了问题所在。公司防火墙阻止5228的本机GCM端口上的流量。(5229和5230是also mentioned with relation to GCM但我们根本没有看到任何尝试在这些端口上的流量。)这在其他地方有很好的记录(只是谷歌< em> GCM端口5228 )。
我无法在任何地方找到清楚记录的内容,但我们已经从我们的服务器日志和手机上运行Connection Tracker中发现,Android的较新版本是否回归到使用端口443(标准HTTPS端口)大多数防火墙默认允许流量通过。这就是我们运行较新Android版本的设备即使在防火墙后面工作的方式。我不确切知道Android版本引入了哪个端口443后备,但它介于4.1.2(不工作)和4.3(工作)之间。
答案 1 :(得分:0)
我没有看到上面的清单条目,但几天前我遇到了确切的问题,清单包必须与 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" />
在我的情况下,声明的包不匹配,以便为以前版本的应用程序提供升级路径。