Согласно документации ,
API Pu sh дает веб-приложениям возможность получать сообщения, отправленные им с сервера, независимо от того, является ли веб-приложение или нет. находится на переднем плане или даже загружен в данный момент на пользовательском агенте.
При правильной реализации это, по-видимому, предполагает, что Android Firefox сможет обрабатывать уведомления pu sh, даже если приложение находится в фоновом режиме.
Действительно, у меня это работает совершенно нормально на Android Chrome, но на Android Firefox, как только браузер находится в фоновом режиме в течение короткого промежутка времени (кажется, достаточно нескольких часов на устройствах Android 10, на которых я это тестировал), уведомления pu sh перестают поступать, и они даже не отображаются после повторной загрузки браузера , даже если я указываю TTL 60 * 60 * 24.
Более конкретно, у меня есть примеры пользователей, которые подписываются на сообщения web pu sh и при отправке сообщений в Mozilla pu sh сервер, я буду Всегда получаю 201 ответ. Сообщения отображаются нормально, когда браузер находится на переднем плане, но, опять же, через некоторое время в фоновом режиме они перестают отображаться. Я указал "normal"
для заголовка "Urgency"
и вывод Python int(time.time()) + (12 * 60 * 60)
для срока действия VAPID.
Сначала я подозревал, что виновником является TTL, но в соответствии с на это сообщение в блоге , я бы не получил 201 с, если бы это было проблемой.
Мой работник службы выглядит следующим образом:
self.addEventListener("push", function(event) {
if (event.data) {
data = event.data.json()
showLocalNotification(data.title, data.message, self.registration);
}
});
const showLocalNotification = (title, body, swRegistration) => {
const options = {
body: body,
badge: "/badge.png",
icon: "/plug-512.png",
};
swRegistration.showNotification(title, options);
};
Я пытался добавление тривиального обработчика событий для fetch
, но это также не имеет значения.
Я использую pywebpush
для выполнения запросов к серверам pu sh и py_vapid
для обработки подписи; конкретная реализация берет строку с именем data
и предоставленную пользователем subscription_info
и создает запрос следующим образом:
import time
from urllib.parse import urlparse
from pywebpush import WebPusher
from py_vapid import Vapid
def send_push(data, subscription_info):
subscription_info = row
pusher = WebPusher(subscription_info)
url = urlparse(subscription_info['endpoint'])
aud = "{}://{}".format(url.scheme, url.netloc)
vapid_claims = {'sub': 'mailto:mail@example.com'}
vapid_claims['aud'] = aud
vapid_claims['exp'] = int(time.time()) + (12 * 60 * 60)
vv = Vapid.from_string('my-key')
vapid_headers = vv.sign(vapid_claims)
vapid_headers['Urgency'] = 'normal'
resp = pusher.send(data, vapid_headers, ttl=60*60*24)
assert resp.status_code == 201
Приложение в настоящее время live here .