0

Google Firebase Cloud Messagingを超えて1人の受信者に通知を送信すると、その受信者のトークンを削除する必要がある応答が返されることがあります(たとえば、Androidアプリを再インストールしてトークンが変更されたためです)。(200 + error:MissingRegistration200 + error:InvalidRegistration200 + error:NotRegisteredasync Jetty HTTPクライアントの応答コールバックにユーザーコンテキストオブジェクトを渡すにはどうすればよいですか?

私の質問は:

バック非ブロックJetty HTTP clientの応答コールバックにその文字列(FCMトークン)を渡す方法は?

現在、私の問題を回避するには、私の要求にカスタムHTTPヘッダーを追加することです:

X-token: APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx... 

し、私は応答コールバックでそれを取得します。しかし、これはハックです。FCMはそのようなヘッダを指定しておらず、より多くのカスタムデータ(私のアプリの内部ユーザID)を返す必要があります。

ここにmy current source codeのカスタムHTTPヘッダーがあります。どうすれば変更できますか?

あなたが要求 属性としてトークンを設定し、それをバック取得したい
private static final String FCM_URL     = "https://fcm.googleapis.com/fcm/send"; 
private static final String FCM_KEY     = "key=REPLACE_BY_YOUR_KEY"; 
private static final String FCM_RESULTS    = "results"; 
private static final String FCM_ERROR    = "error"; 
private static final String FCM_NOT_REGISTERED  = "NotRegistered"; 
private static final String FCM_MISSING_REGISTRATION = "MissingRegistration"; 
private static final String FCM_INVALID_REGISTRATION = "InvalidRegistration"; 

private static final String FCM_X_TOKEN    = "X-token"; 
private static final String TOKEN     = "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."; 

private static final Map<String, Object> REQUEST  = new HashMap<>(); 
private static final Map<String, Object> NOTIFICATION = new HashMap<>(); 
private static final Map<String, Object> DATA   = new HashMap<>(); 

static { 
    REQUEST.put("to", TOKEN); 
    REQUEST.put("notification", NOTIFICATION); 
    REQUEST.put("data", DATA); 
    NOTIFICATION.put("body", "great match!"); 
    NOTIFICATION.put("title", "Portugal vs. Denmark"); 
    NOTIFICATION.put("icon", "myicon"); 
    DATA.put("Nick", "Mario"); 
    DATA.put("Room", "PortugalVSDenmark"); 
} 

private static final SslContextFactory sFactory = new SslContextFactory(); 
private static final HttpClient sHttpClient = new HttpClient(sFactory); 
private static final BufferingResponseListener sFcmListener = new BufferingResponseListener() { 
    @Override 
    public void onComplete(Result result) { 
     if (!result.isSucceeded()) { 
      System.err.println(result.getFailure()); 
      return; 
     } 

     String body = getContentAsString(StandardCharsets.UTF_8); 

     try { 
      Map<String, Object> resp = (Map<String, Object>) JSON.parse(body); 
      Object[] results = (Object[]) resp.get(FCM_RESULTS); 
      Map map = (Map) results[0]; 
      String error = (String) map.get(FCM_ERROR); 
      System.out.printf("error: %s\n", error); 
      if (FCM_NOT_REGISTERED.equals(error) || 
       FCM_MISSING_REGISTRATION.equals(error) || 
       FCM_INVALID_REGISTRATION.equals(error)) { 
       String token = result.getRequest().getHeaders().get(FCM_X_TOKEN); 
       System.out.printf("TODO delete invalid FCM token from the database: %s\n", token); 
      } 
     } catch (Exception ex) { 
      System.err.println(ex); 
     } 
    } 
}; 

public static void main(String[] args) throws Exception { 
    sHttpClient.start(); 
    sHttpClient.POST(FCM_URL) 
     .header(HttpHeader.AUTHORIZATION, FCM_KEY) 
     .header(HttpHeader.CONTENT_TYPE, "application/json") 
     .header(FCM_X_TOKEN, TOKEN) // Workaround, how to improve? 
     .content(new StringContentProvider(JSON.toString(REQUEST))) 
     .send(sFcmListener); 
} 

答えて

1

httpClient.POST(url) 
     .attribute(key, token) 
     ... 
     .send(new BufferingResponseListener() { 
      @Override 
      public void onComplete(Result result) { 
       Object token = result.getRequest().getAttribute(key); 
       ... 
      } 
     }); 
+0

はありがとう、私は '文字列トークン= String.valueOf(result.getRequestを()を使用しています.getAttributes()。get(key)); ' –

関連する問題