简体   繁体   English

Firebase云消息传递requireInteraction不起作用

[英]Firebase Cloud Messaging requireInteraction not work

Reference: https://github.com/firebase/quickstart-js/tree/master/messaging 参考: https : //github.com/firebase/quickstart-js/tree/master/messaging

I have added the key-value pair: 我添加了键值对:

"requireInteraction": true

But the notification in Desktop Chrome still disappear after 20 seconds. 但是20秒钟后,桌面Chrome中的通知仍会消失。 Does any one know if Firebase supports this key-value pair? 有谁知道Firebase是否支持此键值对吗? Thanks! 谢谢!

My example below. 我的例子如下。 Please change [...] to yours. 请更改[...]到你的。

curl -X POST -H "Authorization: key=[...]" -H "Content-Type: application/json" -d '{
  "notification": {
    "requireInteraction": true,     
    "title": "This is custom title",
    "body": "this is custom body",
    "click_action": "https://google.com",
    "data" : {"requireInteraction": true  }
 },
  "to": "[...]",
}' "https://fcm.googleapis.com/fcm/send"

Firebase strips the requireInteraction property from the notification payload when the message is delivered. 传递邮件时,Firebase会从notification有效负载中剥离requireInteraction属性。 The workaround that works is to use the data property instead of the notification . 可行的解决方法是使用data属性而不是notification You can then use the setBackgroundMessageHandler() method to build the notification as you want it to be: 然后,您可以使用setBackgroundMessageHandler()方法来构建所需的通知:

messaging.setBackgroundMessageHandler(function (payload) {
    return self.registration.showNotification(payload.data.title,
        Object.assign({data: payload.data}, payload.data));
});

I've set data above, because the click_action no longer works with this approach and you need to register the desired onclick handler yourself. 我已经在上面设置了data ,因为click_action不再适用于这种方法,并且您需要自己注册所需的onclick处理程序。 Here's a working service worker that does exactly what you intend with your set notification , but uses the data property instead: 这是一个工作中的服务人员,可以完全按照您的设置notification ,但是使用data属性代替:

// import scripts omitted 

const messaging = firebase.messaging();
// [END initialize_firebase_in_sw]

self.addEventListener('notificationclick', e => {
    let found = false;
    let f = clients.matchAll({
        includeUncontrolled: true,
        type: 'window'
    })
        .then(function (clientList) {
            for (let i = 0; i < clientList.length; i ++) {
                if (clientList[i].url === e.notification.data.click_action) {
                    // We already have a window to use, focus it.
                    found = true;
                    clientList[i].focus();
                    break;
                }
            }
            if (! found) {
                clients.openWindow(e.notification.data.click_action).then(function (windowClient) {});
            }
        });
    e.notification.close();
    e.waitUntil(f);
});

// [START background_handler]
messaging.setBackgroundMessageHandler(function (payload) {
    console.log('[firebase-messaging-sw.js] Received background message ', payload);
    // Customize notification here

    return self.registration.showNotification(payload.data.title,
        Object.assign({data: payload.data}, payload.data));

});
// [END background_handler]

Where this would be your curl call: 这将是您的curl调用:

curl -X POST -H "Authorization: key=yourKey-" -H "Content-Type: application/json" -d '{
"data": {
    "title": "fooTitle",
    "body": "foo",
    "icon": "image.jpg",
    "click_action": "http://localhost:8000",
    "requireInteraction": true
  },
  "registration_ids": ["id1", "id2"]
}' "https://fcm.googleapis.com/fcm/send"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM