C2DM Messaging适用于本地服务器但不适用于生产(Google App Engine)

时间:2011-09-06 02:29:41

标签: android google-app-engine gwt google-cloud-datastore android-c2dm

所以我有一个使用C2DM消息传递的应用程序。当它托管在我的计算机上时,它在本地服务器模式下完美运行。但是,当我将应用程序部署到应用程序引擎时,它不再有效!我一直在拔头发,不明白为什么会这样。

我尝试过使用1.5.2和1.5.3 App Engine SDK,并针对Eclipse上的2.3和2.4 GWT插件构建。这些似乎都不起作用。我可以很好地注册手机,但似乎没有C2DM消息到达手机。

2 个答案:

答案 0 :(得分:2)

好的,所以我一直在挖掘,我发现Google提供的代码存在错误。在本地服务器上,它以全小写(MyEmail@bomb.com - > myemail@bomb.com)存储注册数据用户名。在生产服务器上,它不使用全小写来存储电子邮件。以下方法查询数据存储区,以小写形式提供电子邮件作为参数。

解决方案,注释掉指定的行,或者在注册时将电子邮件保存到数据存储区时找到使用全部小写的方法。

/**
 * Helper function - will query all registrations for a user.
 */
@SuppressWarnings("unchecked")
public static List<DeviceInfo> getDeviceInfoForUser(String user) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
        // Canonicalize user name
----->  user = user.toLowerCase(Locale.ENGLISH);
        Query query = pm.newQuery(DeviceInfo.class);
        query.setFilter("key >= '" +
                user + "' && key < '" + user + "$'");
        List<DeviceInfo> qresult = (List<DeviceInfo>) query.execute();
        // Copy to array - we need to close the query
        List<DeviceInfo> result = new ArrayList<DeviceInfo>();
        for (DeviceInfo di : qresult) {
            result.add(di);
        }
        query.closeAll();
        log.info("Return " + result.size() + " devices for user " + user);
        return result;
    } finally {
        pm.close();
    }
}

答案 1 :(得分:0)

在查询之前添加user = user.toLowerCase(Locale.ENGLISH);,肯定会有效。