4

我在验证 GCM 令牌时有点困惑。我正在使用 Sencha 框架在跨平台应用程序中工作,而我的服务器端使用 Java。我对如何验证注册 ID(GCM 令牌)有疑问?是否有任何特定的 API 来验证 GCM 令牌?你能指导我如何在客户端或服务器端处理这个问题吗?我已经在服务器端做了注册部分,用户可以在数据库中注册他们的 GCM 令牌。现在我需要验证这个注册令牌。

每两周注销一次应用程序是一个好方法吗?

4

2 回答 2

7

您在客户端注册到 GCM 并从 GCM 取消注册。这就是您从 Google 获得注册 ID 的地方。

获得注册 ID 后,您应该认为它在以下日期之前有效:

  1. 您将带有注册 ID 的消息发送到 Google 的 GCM 服务器并收到 NotRegistered 或 InvalidRegistration 错误。在这些情况下,您应该从数据库中删除注册 ID。

  2. 您将带有注册 ID 的消息发送到 Google 的 GCM 服务器并获得成功的响应,但响应中包含规范的注册 ID。在这种情况下,您应该将注册 ID 替换为规范注册 ID。

  3. 该应用程序明确地从 GCM 中取消注册,并通知服务器,在这种情况下,您应该从数据库中删除注册 ID。

我认为每两周注销一次应用程序没有任何意义。谷歌的代码示例只有在安装了新版本后才重新注册该应用程序,即使这样,他们也不会在重新注册之前取消注册。

于 2013-09-25T14:14:29.990 回答
1

使用 canonicalID链接解决 GCM 验证的解决方案

 private void asyncSend(List<String> partialDevices) {
    // make a copy
    final List<String> devices = new ArrayList<String>(partialDevices);
    threadPool.execute(new Runnable() {

      public void run() {
        Message message = new Message.Builder().build();
        MulticastResult multicastResult;
        try {
          multicastResult = sender.send(message, devices, 5);
        } catch (IOException e) {
          logger.log(Level.SEVERE, "Error posting messages", e);
          return;
        }
        List<Result> results = multicastResult.getResults();
        // analyze the results
        for (int i = 0; i < devices.size(); i++) {
          String regId = devices.get(i);
          Result result = results.get(i);
          String messageId = result.getMessageId();
          if (messageId != null) {
            logger.fine("Succesfully sent message to device: " + regId +
                "; messageId = " + messageId);
            String canonicalRegId = result.getCanonicalRegistrationId();
            if (canonicalRegId != null) {
              // same device has more than on registration id: update it
              logger.info("canonicalRegId " + canonicalRegId);
              Datastore.updateRegistration(regId, canonicalRegId);
            }
          } else {
            String error = result.getErrorCodeName();
            if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
              // application has been removed from device - unregister it
              logger.info("Unregistered device: " + regId);
              Datastore.unregister(regId);
            } else {
              logger.severe("Error sending message to " + regId + ": " + error);
            }
          }
        }
      }});
  }
于 2013-10-01T09:45:21.397 回答