Theo như tôi có thể nói không có plugin nào thực hiện tất cả những gì bạn cần. Tuy nhiên ..
tôi có thể nhận được thông báo từ xa, tạo thông báo cục bộ và hiển thị thông báo đó và sau đó trả lời thông báo với phạm vi 'hết hạn' hoặc 'xóa', hãy xóa thông báo cục bộ để mà người dùng của tôi không nhìn thấy một bản sao của thông tin?
Hầu hết các plugin có xu hướng phát hiện trạng thái của ứng dụng và thêm thông báo từ xa vào màn hình chính với thông tin bạn đã đẩy theo mặc định, có cách nào để tránh điều này không?
Có, bằng cách sử dụng silent notifications và tự xây dựng thông báo địa phương.
Đối với dự án tôi đang làm việc, tôi đã sửa đổi plugin cordova-plugin-fcm
để thêm hỗ trợ (thông báo theo yêu cầu) bỏ qua/hiển thị, gửi nhiều thông báo tới ứng dụng cordova và một số PR chưa được đưa vào. Ngoài ra, tôi tự xây dựng thông báo để có toàn quyền kiểm soát những gì được hiển thị. Bạn có thể xem mã để nhận một số ý tưởng.
Tóm lại nó hoạt động như thế này:
Đầu tiên, tôi gửi một "im lặng" push to các ứng dụng, mà không được hiển thị bởi Android:
{
"content_available": true, // IMPORTANT: For Apple -> content-available: 1, for firebase -> content_available: true
"priority": "high",
"to": "/topics/all", // or to a fcm token
"data"{
"title": "My title", // this implies that you display the notification by yourself
"body": "My body", // this implies that you display the notification by yourself
"type": "NEW_USER_MESSAGE", // only relevant to this project
"userId": "1", // only relevant to this project
"timestamp", "150000000"
}
}
Lưu ý: Nếu tải trọng có "notification": {}
mục, Android sẽ hiển thị nó trên khay hệ thống (nếu ứng dụng ở chế độ nền). https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
Thứ hai, khi nhấn đến ứng dụng (trong onMessageReceived()), tôi tạo thông báo địa phương, gán cho nó TAG và ID. Đây là cách bạn có thể sử dụng để loại bỏ nó sau này. Ví dụ: Ví dụ: bạn có thể tạo thông báo cục bộ với TAG "NEW_USER_MESSAGE" và ID 1 (một hằng số cho biết trạng thái của tin nhắn hoặc ID người dùng chẳng hạn). Ngoài ra, Android will replace notifications with the same TAG and ID, vì vậy đây là một cách khác để tự động thay thế thông báo (ví dụ: nếu bạn gửi một thông báo chung, như "Bản cập nhật mới khả dụng").
public static String TYPE_NEW_USER_MESSAGE = "NEW_USER_MESSAGE";
public static String TYPE_USER_LEFT_ROOM = "USER_LEFT_ROOM";
NotificationManager notificationManager =
(NotificationManager) _ctx.getSystemService(Context.NOTIFICATION_SERVICE);
// based in the type of the message you've received, you can stylize the notification
if (type.equals(TYPE_USER_LEFT_ROOM)){
notificationBuilder.setColor(Color.RED);
notificationBuilder.setLights(Color.RED, 1000, 500);
}
else if (type.equals(TYPE_NEW_USER_MESSAGE)){
notificationBuilder.setColor(Color.BLUE);
notificationBuilder.setLights(Color.BLUE, 1000, 1000);
}
Notification n = notificationBuilder.build();
notificationManager.notify(type, userId, n);
Một lợi thế của việc thực hiện theo cách này, là bạn có toàn quyền kiểm soát thông báo được hiển thị, để bạn có thể tạo kiểu cho thông báo như bạn muốn.
Nếu bạn muốn hủy tin nhắn đã hết hạn, bạn có thể check out the elapsed time between the sent timestamp and the current timestamp:
java.util.Date now = new java.util.Date();
java.util.Date sent_timestamp = new java.util.Date(Long.valueOf(timestamp.toString()));
final Long elapsed_time = ((now.getTime() - sent_timestamp.getTime())/1000);
Log.d(TAG, "New message. sent " + elapsed_time + "s ago");
Thứ ba, khi người dùng nhấp vào một thông báo Android sẽ ra mắt ứng dụng của bạn, và các plugin sẽ gửi payload của thông điệp push to khung nhìn cordova (onNotificationReceived()
).
Khi ứng dụng của bạn được mở ra và bạn đã nhận được thông báo push, bạn có thể bỏ qua nó thêm một hành động mới để các plugin:
onNotificationReceived(data){
if (data.wasTapped === true){
if (data.type === 'NEW_USER_MESSAGE'){
FCMPlugin.dismissNotification(NEW_USER_MESSAGE, 1);
}
}
}
Hành động Android:
else if (action.equals(ACTION_DISMISS_NOTIFICATION)) {
cordova.getThreadPool().execute(new Runnable() {
public void run() {
try{
Log.d(TAG, "FCMPlugin dismissNotificaton: " + args.getString(0)); //tag
NotificationManager nManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(args.getString(0)/*NEW_USER_MESSAGE*/, args.getInt(1) /*1*/);
Log.d(TAG, "FCMPlugin dismissNotificaton() to remove: " + id); //tag
callbackContext.success();
}catch(Exception e){
callbackContext.error(e.getMessage());
}
}
});
https://github.com/TrustedCircles/cordova-plugin-fcm/blob/master/src/android/FCMPlugin.java#L286
Và phương pháp tiếp xúc với ứng dụng cordova:
// dismisses a notification by tag+id
FCMPlugin.prototype.dismissNotification = function(tag, userId, success, error){
exec(success, error, "FCMPlugin", 'dismissNotification', [tag, userId]);
}
https://github.com/TrustedCircles/cordova-plugin-fcm/blob/master/www/FCMPlugin.js#L65
cách bạn chuyển đổi thông báo từ xa sang thông báo địa phương? – Pritish