GCM推送通知无法通过代理传递

4
我正在开发一个小型应用程序作为我的课程项目(类似于Snapchat),可以发送和接收图片和视频。我正在使用名为Parse的BaaS,它使用GCM来传递推送通知。然而,问题是我的校园使用代理网络,因此许多应用程序无法工作(WhatsApp、Instagram),而一些应用程序(Snapchat)可以工作,但它们的通知无法传递。我的应用程序也是如此。
假设我对代理网络没有任何影响,并且蜂窝网络不可选,是否有可能克服这个问题?

你有一个发送推送通知的应用程序,对吧? - Hardik Chauhan
没错。我的应用程序会向已发送消息的用户发送推送通知,以通知他们有新消息。 - Rafay
3个回答

4

这完全取决于您的校园网络访问策略。如果您的校园代理防火墙不提供对这些网站的访问,则无法进行访问。但是,您可以请求他们通过他们的代理防火墙允许访问这些URL。

或者,您可以通过在您的代码中添加行来使用其他外部代理服务器:

System.setProperty("https.proxyHost", "<IP>"); System.setProperty("https.proxyPort", "<Port>");

当您尝试连接Google APIs时,请使用类似以下内容的代码:

URL url = new URL("https://android.googleapis.com/gcm/send");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "key="+<your api key>);

在尝试连接Google API之前,请添加代理设置行,即上述两行。同时,尝试使用你的校园代理或其他外部代理,这样你就能知道问题是否出在你的校园代理上。希望这个方法能解决你的问题..!!!!!

假设我的校园网络没有明确阻止访问Google API,如果我添加这两行代码,我就能够使用它们了吗? - Rafay
我刚在校园里尝试了这种方法,但它没有起作用。 - Rafay
你得到了什么错误或响应,是来自Google API的响应还是Http错误? - ajitksharma

2

使用类似如下方式:

import com.google.android.gcm.server.Sender;

public class ProxySender extends Sender {

public ProxySender(String key) {
    super(key);
    // TODO Auto-generated constructor stub
}

@Override
protected HttpURLConnection getConnection(String url) throws IOException {

    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("<YOUR SERVER IP>", YOUR PORT));

    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(proxy);

    return conn;

}
}

这似乎是我的问题的答案,但我无法实现它。它是如何工作的?在哪里放置此代码,它是否已过时?请提供一些说明... - krozaine

2
根据谷歌的要求,为了正常接收GCM消息,我们需要打开一些端口。具体如下:
如果您的组织有防火墙限制与互联网之间的通信,您需要配置它以允许与GCM建立连接,以便您的Android设备可以接收消息。 所需打开的端口是:5228、5229和5230。GCM通常只使用5228端口,但有时也会使用5229和5230端口。 GCM没有提供特定的IP地址,因此您应该允许防火墙接受到Google ASN 15169中列出的所有IP地址块中包含的所有出站连接。
您是否试图通过Parse SDK发送GCM消息? 您能否访问这些URL?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接