区分GCM和C2DM ID

时间:2012-09-26 14:37:18

标签: android android-c2dm google-cloud-messaging

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

2 个答案:

答案 0 :(得分:1)

如果您不使用AppEngine,则需要执行以下操作。

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

答案 1 :(得分:0)

假设您正在使用App Engine来实施GCM / C2DM。

在App Engine的deviceInfo实体中,已有“type”字段。这是您要修改为“ac2dm”或“gcm”的字段。

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

<强> EX:

     // 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

,请阅读此内容