Làm cách nào để nhận dữ liệu tùy chỉnh khi ứng dụng bị chấm dứt thông qua thông báo đẩy bằng cách sử dụng firebase_messaging?


8

Như trong tiêu đề, cách giải quyết hiện tại là gì để nhận dữ liệu tùy chỉnh khi người dùng nhấp vào thông báo khi ứng dụng bị chấm dứt?

Có vẻ như trên Android không thể nhận được thông báo dữ liệu trong onLaunch (đó là cách lý tưởng) Trên iOS tôi chưa thử vì tôi phải đối mặt với vấn đề này trước tiên.

Có manh mối nào không?

Thông tin bổ sung: Thông báo mà tôi đang gửi qua a firebase cloud functionở dạng này:

  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

https://firebase.google.com/docs/cloud-messaging/concept-options

trên onResumetôi có thể thực hiện một hành động, nhưng onLaunchdường như không được gọi.


Bạn có thể thử sử dụng Tải trọng JSON tùy chỉnh .
nhà vô địch-á quân

Câu trả lời:


2

Đây là định dạng mà tải trọng của bạn nên có với dữ liệu đi kèm. Nó hoạt động vì đây là cách tôi đã làm cho nó hoạt động trong dự án của mình. Ngoài ra, để mọi thứ hoạt động chính xác, có một câu trả lời ở đây có thể hữu ích cho việc thiết lập dự án chung:

 {
      notification: {
        title: 'A title',
        body: 'The body.'
      },
      data: {
        // your data here
      },
      android: {
        ttl: 3600 * 1000,
        notification: {
          click_action: 'FLUTTER_NOTIFICATION_CLICK'
        }
      },
      // The below is for iOS specific properties
      // apns: {
      //   payload: {
      //     aps: {
      //       badge: 42
      //     }
      //   }
      // },
      tokens: [] // or a single 'token'
    }

những gì là androidquan trọng là phải làm gì?
Stefano Saitta

có các thuộc tính cụ thể chỉ liên quan đến một nền tảng. Android one chỉ dành riêng cho thông báo Android và apns dành cho iOS.
DF_

2

Tôi nghĩ rằng, bạn đã nhận được dữ liệu trênLaunch, chỉ cần chờ một chút. Tôi đã viết nó bởi vì tôi đã gặp điều tương tự.

Bạn có thể thử cái này không

firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async { .. },
  onResume: (Map<String, dynamic> message) async { .. },
  onLaunch: (Map<String, dynamic> message) async {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      Timer(const Duration(seconds: 7), () {
        // your process...
      });
    });
  },
);

Cũng trong tình huống của tôi, tôi đã sử dụng nó như thế, và giải quyết.

onLaunch: (Map<String, dynamic> message) async {
    WidgetsBinding.instance.addPostFrameCallback((ignored) {
      Timer.periodic(const Duration(seconds: 1), (timer) {
        if (CurrentUser.currentUser != null) {
          timer.cancel(); // important **
          // redirect process with post details inside data
          if (message['data']['type'] == NotifTypes.NEW_POST)
            goGroupAndPost(Map.from(message['data'])); 
        }
      });
    });
  },

0

Nói nếu Hoạt động của bạn ở phía trước (và phản ứng khác nhau) có thể hơi khó. Cách yêu thích của tôi là đăng ký một địa phương BroadcastReceivertrong Hoạt động và sau đó thực hiện sendBroadcasttừ dịch vụ. Bạn sẽ nhận được đúng từ phương thức đó nếu bộ thu của bạn đang chạy (có nghĩa là ứng dụng của bạn ở phía trước và ngược lại là sai .

Bạn có thể xem ví dụ về này (sử dụng GCM, nhưng logic là như nhau cho FCM) Nguồn

Ngoài ra đây là một ví dụ tuyệt vời MyFirebaseMessagingService


0

Trong nhà cung cấp của bạn, bạn có thể thực hiện cấu hình bổ sung sau, nếu nó được thực hiện chính xác trong gỡ lỗi của bạn, bạn nên hình dung mã thông báo:

class PushNotificationProvider{
    FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

    initNotification(){
      _firebaseMessaging.requestNotificationPermission();
      _firebaseMessaging.getToken().then((token)){
        print('===== FCM Token ======');
        print(token);
      }
    }

    _firebaseMessaging.configure{
      onMessage(info){
         print('===== On Message =====');
         print(info);
       },
     onLaunch(info){
         print('===== On Launch =====');
         print(info);
       },
     onResume(info){
         print('===== On Resume =====');
         print(info);
       },

    }
}

với gói này: https://pub.dev/packages/firebase_messaging trong dự án của bạn và trong căn cứ hỏa lực của bạn, trong Tin nhắn trên đám mây -> Tùy chọn -> Dữ liệu cá nhân -> khóa (click_action) -> giá trị (FLUTTER_NOTIFICATION_CLICK) bạn cần thêm FLUTTER_NOTIFICATION_CLICK.

Với điều này, bạn đã có thể thử thông báo đẩy căn cứ hỏa lực của mình.


Đây là những gì tôi đã có, nhưng dường như nó không hoạt động onLaunchnếu bạn gửi thông báo datatrong đó
Stefano Saitta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.