Cảnh báo Có một lý do rất quan trọng vì sao chúng tôi không đề cập đến phương pháp này ở bất kỳ đâu. Điều này cho thấy khóa máy chủ của bạn trong APK mà bạn đặt trên mọi thiết bị khách. Nó có thể (và do đó sẽ) được lấy từ ở đó và có thể dẫn đến việc lạm dụng dự án của bạn. Tôi rất khuyên bạn nên chống lại cách tiếp cận này, ngoại trừ các ứng dụng mà bạn chỉ đặt trên thiết bị của riêng bạn. - Frank van Puffelen
Ok, vì vậy câu trả lời của Frank chính xác là Firebase
không hỗ trợ thiết bị cho nhắn tin thiết bị. Tuy nhiên có một lỗ hổng trong đó.Máy chủ Firebase không xác định xem bạn đã gửi yêu cầu từ máy chủ thực hay bạn đang thực hiện yêu cầu từ thiết bị của mình.
Vì vậy, tất cả những gì bạn phải làm là gửi máy chủ nhắn tin Post Request
tới Firebase
cùng với Khóa máy chủ. Chỉ cần lưu ý rằng khóa máy chủ không được cho là trên thiết bị, nhưng không có tùy chọn nào khác nếu bạn muốn nhắn tin từ thiết bị đến thiết bị bằng Nhắn tin Firebase.
Tôi đang sử dụng OkHTTP thay vì cách mặc định để gọi API Rest. Mã này giống như thế này -
public static final String FCM_MESSAGE_URL = "https://fcm.googleapis.com/fcm/send";
OkHttpClient mClient = new OkHttpClient();
public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {
new AsyncTask<String, String, String>() {
@Override
protected String doInBackground(String... params) {
try {
JSONObject root = new JSONObject();
JSONObject notification = new JSONObject();
notification.put("body", body);
notification.put("title", title);
notification.put("icon", icon);
JSONObject data = new JSONObject();
data.put("message", message);
root.put("notification", notification);
root.put("data", data);
root.put("registration_ids", recipients);
String result = postToFCM(root.toString());
Log.d(TAG, "Result: " + result);
return result;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject resultJson = new JSONObject(result);
int success, failure;
success = resultJson.getInt("success");
failure = resultJson.getInt("failure");
Toast.makeText(getCurrentActivity(), "Message Success: " + success + "Message Failed: " + failure, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getCurrentActivity(), "Message Failed, Unknown error occurred.", Toast.LENGTH_LONG).show();
}
}
}.execute();
}
String postToFCM(String bodyString) throws IOException {
RequestBody body = RequestBody.create(JSON, bodyString);
Request request = new Request.Builder()
.url(FCM_MESSAGE_URL)
.post(body)
.addHeader("Authorization", "key=" + SERVER_KEY)
.build();
Response response = mClient.newCall(request).execute();
return response.body().string();
}
Tôi hy vọng Firebase sẽ có giải pháp tốt hơn trong tương lai. Nhưng cho đến lúc đó, tôi nghĩ đây là cách duy nhất. Cách khác là gửi tin nhắn chủ đề hoặc nhắn tin nhóm. Nhưng điều đó không nằm trong phạm vi của câu hỏi.
Cập nhật:
Các JSONArray được định nghĩa như thế này -
JSONArray regArray = new JSONArray(regIds);
regIds là một mảng String của id đăng ký, bạn muốn gửi thông điệp này đến. Hãy nhớ rằng các id đăng ký phải luôn nằm trong một mảng, ngay cả khi bạn muốn nó gửi đến một người nhận.
Vì vậy, bạn nghĩ rằng từ 5 dòng mã và một số giải thích rõ ràng về những gì đã được thực hiện, ai đó sẽ giúp bạn hiểu tại sao * thiết bị khác không nhận được bất kỳ tin nhắn nào *? Bạn là người lạc quan như vậy :) – Selvin
@Selvin Nếu ai đó không thể hiểu mã tôi đã thêm, họ không đủ điều kiện để trả lời anyways. Nếu bạn đã từng sử dụng FCM trước đó, mã này được lấy trực tiếp từ hướng dẫn chính thức, ngoại trừ phần mã thông báo đăng ký. Để hiểu được, vui lòng đọc bản cập nhật. – noob
có vấn đề 'getInstance() send' ... điều này thậm chí sẽ không biên dịch – Selvin