2

Код: https://github.com/firebase/quickstart-js/tree/master/messagingFirebase Cloud Messaging requireInteraction не работает

я добавил пару ключ-значение:

"requireInteraction": true 

Но уведомление рабочего стола Chrome еще исчезнет через 20 секунд. Кто-нибудь знает, поддерживает ли Firebase эту пару ключ-значение? Благодаря!

Мой пример ниже. Пожалуйста, измените [...] на свой.

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" 
+0

Привет Самуил. Я не думаю, что ['requireInteraction'] (https://developers.google.com/web/updates/2015/10/notification-requireInteraction) - это то, что вы должны установить в своей полезной нагрузке. Его следует просто объявить, когда вы * строите * уведомление. Если вопрос только о поддержке, то 'requireInteraction' не принадлежит к полезной нагрузке« уведомление », но * может существовать * в« полезной нагрузке данных ». :) –

+0

@AL. Я попытался добавить requireInteraction: true в полезной нагрузке данных или полезной нагрузке уведомления, но всплывающее уведомление на моем рабочем столе Chrome все равно исчезает через 20 секунд. –

+0

. Одно из всплывающих окон ниже демонстрации не будет закрыто, пока пользователь не нажмет на него. https://googlechrome.github.io/samples/notifications/requireInteraction.html –

ответ

2

Firebase раздевает requireInteraction свойства от notification полезной нагрузки, когда сообщение будет доставлено. Обходной путь, который работает, заключается в использовании свойства data вместо notification. После этого вы можете использовать метод setBackgroundMessageHandler() построить уведомление, как вы хотите, чтобы это было:

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

Я никогда установить data выше, потому что click_action больше не работает с этим подходом, и вам нужно зарегистрировать нужный обработчик OnClick сам. Вот рабочая служба работника, который делает именно то, что вы собираетесь с набором notification, но использует свойство данных вместо:

// 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] 

Где это будет ваш локон вызова:

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" 
+0

это все еще правильно, я не могу заставить уведомление продолжать? Я использую firebase 4.3.0, единственная разница между запросом curl выше и моим заключается в том, что у меня все еще есть полезная нагрузка уведомления, поэтому у меня есть как данные, так и уведомление – virtualLast

+1

. Думаю, вам нужно решить одно. Если я правильно помню, уведомление имеет приоритет, и данные будут использоваться только в том случае, если нет полезной нагрузки для уведомлений. – baao

+0

блестящая благодарность, бутон - удалил материал уведомления, и он работал как шарм – virtualLast