我可以在没有任何服务器端代码的情况下构建一个非常简单的支持 Google Cloud Messaging 的 Android 应用程序吗?

Posted

技术标签:

【中文标题】我可以在没有任何服务器端代码的情况下构建一个非常简单的支持 Google Cloud Messaging 的 Android 应用程序吗?【英文标题】:Can I build a very simple Google Cloud Messaging backed Android application without any server-side code? 【发布时间】:2013-08-12 13:01:52 【问题描述】:

我想为 android 构建一个 GCM 支持的应用程序,目前进展顺利。这真的很简单,我想要实现的只是允许用户将一些消息从他的计算机推送到他的设备。

一旦用户调用register,他就会获得一个注册ID,该ID 保存在共享首选项中。他可以将此注册密钥通过电子邮件发送给他自己保存在他的计算机上,从而允许计算机向他推送通知。

根据我的阅读,注册 ID 可能会每隔一段时间就会过期,明智的做法是再次致电 register。 GCM 的文档反过来说:

注册 GCM 申请并返回注册 ID。你 必须在安装应用程序时调用一次,然后发送 返回注册ID给服务器。

重复调用此方法将返回原始注册 身份证。

同一设备上的同一应用程序的注册密钥是否会更改?如果是这样,我还需要服务器来管理和不断更新这些注册密钥吗? (如果是这样的话:感觉很笨拙,我还需要编写一个 AppEngine 后端来管理他们不断更新的注册密钥,而且我似乎无法理解这种实现的基本原理。)谢谢。

【问题讨论】:

【参考方案1】:

服务器端的目的不仅仅是保留单个设备的注册 ID,正如您在案例中所描述的那样。它用于维护一个包含多个注册 ID 的数据库,并且可以决定何时向它们发送消息以及这些消息将包含哪些内容。

在您的简单情况下,您似乎不需要服务器端(假设通过电子邮件发送注册 ID 对于您的目的来说是一个足够好的解决方案)。注册 ID 不会经常更改(根据我的经验),即使发生更改,您也可以按照第一次发送时的相同方式重新发送。

【讨论】:

使用注册 ID 对我来说已经足够了。第一次,用户安装应用程序。他可以将注册密钥通过电子邮件发送给自己并在他的计算机中使用。我只是玩弄了我的应用程序,似乎调用register 总是返回一个不同的键,而文档却另有说明。似乎在向服务器发送 GCM 消息时,GCM 服务器会使用设备的新注册密钥进行响应,这只是您必须保存的一个。如果您不保存它并在以后的请求中使用它,GCM 消息将不会通过。 问题是我没有在任何地方发现所有这些问题。大多数 GCm 文档都是在非常宏观的层面上讲的,我感到很困惑。谢谢伊兰。 @MridangAgarwalla 我还没有遇到注册 ID 的这种不断变化的情况,但是我在引入新 API 之前对其进行了测试,所以现在它们可能会更频繁地更改。但是,旧的注册 ID 在不再是最新的注册 ID 后似乎可以继续工作很长时间(我从未遇到过它停止工作的情况)。无论如何,为了给应用分配一个新的注册 ID,它必须显式注册到 GCM,因此应用应该始终知道它的最新注册 ID。【参考方案2】:

在调用函数向 GCM 注册设备之前,您可以检查函数 isRegistered (Context context) 这告诉我们应用程序是否已向 GCM 注册推送通知

Do the registration keys change for the same application on the same device?

是的,注册 ID 可能会更改或过期

这是来自 Android 文档的一些代码

int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion || isRegistrationExpired()) 
    Log.v(TAG, "App version changed or registration expired.");
    return "";

因此,一旦应用升级到新版本,始终建议从您的服务器清除(无效)所有注册 ID,然后再次注册

【讨论】:

您发布的代码是否不适用于旧 GCM 库而不适用于新的 GoogleCloudMessaging 库? 我使用 GCM 而不是新的 GoogleCloudMessaging 库,是的,这适用于 GCM,我不确定它是否也适用于新库 请将链接粘贴到我想阅读的新库文档 developer.android.com/reference/com/google/android/gms/gcm/…

以上是关于我可以在没有任何服务器端代码的情况下构建一个非常简单的支持 Google Cloud Messaging 的 Android 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

存档在没有任何上下文的情况下停止,但在设备上构建时效果很好

我可以在没有自己的后端服务器的情况下在 React 中实现 Stripe 结账吗?

在没有服务器端的情况下构建报价数据库

如何在没有任何错误或警告的情况下找到构建失败的原因

Stack Overflow 如何在不重新加载页面的情况下通知服务器端事件?我在 Firebug 中没有看到任何请求

Web客户端缓存