2017-07-31 38 views
11

Tôi đang xây dựng một ứng dụng sử dụng Ionic Framework thực hiện chức năng trò chuyện tương tự như messenger facebook cũ, trong đó tôi muốn thông báo cho người dùng của một tin nhắn trò chuyện, nhưng nếu họ xem ở nơi khác, tôi muốn xóa thông báo khỏi màn hình chính của họ.Tạo thông báo địa phương để phản hồi thông báo đẩy (từ firebase) trong cordova/ionic

Tôi đang sử dụng firebase làm giao diện người dùng cho thông báo đẩy (mặc dù điều đó có thể được thay đổi mà tôi giả sử).

Tôi biết rằng bạn không thể hết hạn thông báo từ xa, nhưng tôi đã được thông báo rằng bạn có thể hết hạn + xóa thông báo địa phương, vì vậy câu hỏi của tôi là - tôi có thể nhận được thông báo từ xa một cách đáng tin cậy. và hiển thị thông báo đó và sau đó phản hồi lại thông báo có phạm vi 'hết hạn' hoặc 'xóa', hãy xóa thông báo cục bộ để người dùng của tôi không thấy trùng lặp 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?

Xin cảm ơn các bạn.

EDIT: - địa phương thông báo: http://ionicframework.com/docs/native/local-notifications/ - căn cứ hỏa lực Cloud Messaging: https://github.com/fechanique/cordova-plugin-fcm

+1

cách bạn chuyển đổi thông báo từ xa sang thông báo địa phương? – Pritish

Trả lời

4

Các chút khôn lanh chỉ với các thông báo trong cordova/ion là phần JS nhận được thông báo và kích hoạt mã Android.

Tôi đã sử dụng thư viện https://github.com/phonegap/phonegap-plugin-push và nó khá thẳng về phía trước.

Có một cuộc gọi lại khi nhận được thông báo trong JS (Cordova/Ionic), sử dụng tính năng này để hiển thị thông báo cục bộ trong Android.

P.S: Câu trả lời của Basel cho bạn biết cách xóa thông báo của bạn, vì vậy tôi đã quyết định rời khỏi bit đó.

5

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ác vấn đề liên quan