Google Firebase Cloud Messagingを超えて1人の受信者に通知を送信すると、その受信者のトークンを削除する必要がある応答が返されることがあります(たとえば、Androidアプリを再インストールしてトークンが変更されたためです)。(200 + error:MissingRegistration
、200 + error:InvalidRegistration
、200 + error:NotRegistered
)async 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);
}
はありがとう、私は '文字列トークン= String.valueOf(result.getRequestを()を使用しています.getAttributes()。get(key)); ' –