1

我正在将我的应用程序从 C2DM 迁移到 GCM,但我将在其上发送注册 id 的服务器仍将提供 C2DM id。所以我的问题是我可以从我的应用程序中做什么,以便服务器可以识别这是 GCM id。Google 建议随注册 ID 一起发送一个新位。我怎样才能做到这一点。请举个例子。

4

2 回答 2

1

如果您不使用 AppEngine,请执行以下操作。

在您的服务器中,您应该已经有一个存储所有注册 id (reg_id) 的表。您需要在此表中添加另一列,例如“is_gcm_reg_id”。您将此列的所有现有行默认为“0”,因为它们当前都是 C2DM reg_id。如果您愿意,也可以只创建一个新表来存储 GCM reg_ids。

然后在您启用 GCM 的应用程序中,您只需要让您的服务器知道 reg_id 是 GCM reg_id。您没有提到如何将 reg_id 上传到服务器(Web 服务调用?简单的 POST 请求?)。如果使用 Web 服务调用,只需创建一个新方法,该方法将由您的新启用 GCM 的应用程序独占使用。如果使用 POST 请求,只需添加另一个键值对,例如“gcm=true”,您的服务器应该会查找此 kvp。

最后,您应该知道 reg_id 是 GCM 所需的所有部分,并相应地更新“is_gcm_reg_id”列字段(或新的 GCM 表)。

于 2012-09-30T17:23:13.553 回答
0

假设您使用 App Engine 来实现 GCM/C2DM。

在您的 App Engine 的 deviceInfo 实体中,已经有一个“类型”字段。这是您将修改为“ac2dm”或“gcm”的字段。

一个简单的方法是创建一个新的注册请求,它只传递“gcm”而不是“ac2dm”。查看您的 AppEngine 项目并找到 RegistrationInfo 类。查看 register() 方法。只需将“ac2dm”替换为“gcm”即可。

前任:

     // original
 public void register() {
    log.info("register " + this);
    try {
      doRegister(getDeviceRegistrationId(), "ac2dm", getDeviceId(), getAccountName());
    } catch (Exception e) {
      log.info("Got exception in registration: " + e + " - " + e.getMessage());
      for (StackTraceElement ste : e.getStackTrace()) {
        log.info(ste.toString());
      }
    }
    log.info("Successfully registered");
  }

      // new version
     public void register() {
    log.info("register " + this);
    try {
      doRegister(getDeviceRegistrationId(), "gcm", getDeviceId(), getAccountName());
    } catch (Exception e) {
      log.info("Got exception in registration: " + e + " - " + e.getMessage());
      for (StackTraceElement ste : e.getStackTrace()) {
        log.info(ste.toString());
      }
    }
    log.info("Successfully registered");
  }

您可能必须重新编译 RPC 服务才能使其正常工作。

现在,由您来确保您的服务器检查 deviceInfo 实体的“gcm”标签并采取相应措施。另外,如果您还没有看过它,请阅读它https://developer.android.com/guide/google/gcm/c2dm.html

于 2012-09-26T15:32:22.137 回答