2012-09-26 43 views
1

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

回答

1

这是你如果不使用AppEngine需要做的。

在您的服务器中,您应该已经有一个存储所有注册ID(reg_id)的表。您需要在此表中添加另一列,例如'is_gcm_reg_id'。由于当前所有的C2DM reg_id,因此您可以将此列的所有现有行都设置为'0'。如果你喜欢,你也可以创建一个新表来存储GCM reg_ids。

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

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

+0

嘿谢谢..有点好方法,我会尝试......而我正在使用网络服务呼叫 – Rookie

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