4

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

每2周取消注册应用程序是一种好方法吗?

回答

1

解决方案解决在使用canonicalID link的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); 
      } 
      } 
     } 
     }}); 
    } 
7

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

一旦你有一个注册ID,你应该考虑一下有效期至:

  1. 您发送与注册ID到谷歌的服务器GCM的消息,并得到一个NotRegistered或InvalidRegistration错误。在这些情况下,您应该从数据库中删除注册ID。

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

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

我没有看到在每两周注销应用程序的任何意见。一旦安装了新版本的应用,谷歌的代码示例只会重新注册应用,即便如此,它们在重新注册之前也不会取消注册。

+0

是啊,这是确切的解决方案。取得规范的注册编号并用旧的替换。 –

+0

你可以解释什么时候我会得到规范ID,因为当前注册ID有效期为7天。现在我正在跟踪我的服务器中的规范ID –

+0

当前注册ID无效7天。 Google可能会不时更新注册ID。这就是为什么他们发布了一个演示应用,认为7天后注册ID无效,但上次我检查他们从演示中删除了这种情况。如果您注册GCM并获得新的注册ID,则应将其发送到您的服务器以更新数据库。如果您不这样做,服务器可能会在Google的响应中获得规范的注册ID,然后再修改数据库。 – Eran