#google-cloud-messaging #service-worker #web-push #django-push-notifications
#облачные сообщения Google #service-worker #веб-push #django-push-уведомления
Вопрос:
Я возился с django-push-notifications
, следуя руководству Google.
Мой текущий статус — это веб, который, похоже, работает и регистрируется, запрашивает разрешения на уведомления и так далее. Я просматриваю ./manage.py runserver
и использую localhost:8000
. В настоящее время Service Worker работает (как ожидалось?). Когда я выполняю device.send_message("Hello world")
(через push_notification
модуль) Я вижу, что получаю event
сообщение в приложении Javascript. В настоящее время тестируется в Chrome, я планирую адаптировать его для Android.
Что бы я ни пытался, event.data
всегда Null
. Я безуспешно пытался отправлять обычные сообщения, структурированные сообщения и аргумент ключевого слова extra
для send_message
метода.
Я предполагаю, что я чего-то не хватает?
Фрагменты того, что я запускаю (неполный, но не уверен, что имеет отношение)
# Trigger push notifications
device = GCMDevice.objects.all()
device.send_message(<some data here>, extra=<some data here>)
И что касается Javascript в Service Worker:
self.addEventListener('push', function(event) {
console.log('Push message', event);
var data = {};
if (event.data) {
data = event.data.json();
}
console.log('Push data', data);
...
Что касается настройки и регистрации:
navigator.serviceWorker.register('/sw.js').then(function () {
return navigator.serviceWorker.ready;
}).then(function (serviceWorkerRegistration) {
return serviceWorkerRegistration.pushManager.subscribe({userVisibleOnly: true})
}).then(function (pushSubscription) {
// Last part of the URL is indeed the Registration ID for the GCM
var reg_id = pushSubscription.endpoint.split('/').pop();
console.log('Subscribed! Endpoint:', reg_id);
// Send the registration_id, which is the only required field
return $http({
method: "POST",
url: "{% url 'api:gcmdevice-list' %}",
data: {registration_id: reg_id}
});
}).catch(function (error) {
console.log('Service Worker Error:', error);
});
Каков правильный способ передачи информации из Django в уведомление?
Комментарии:
1. Вы проверили,
event.data
естьnull
? Возможно, вызов.json()
возвращаетсяnull
? Можете ли вы попробовать сделатьevent.date.text()
вместо этого?2. С консоли Chrome я вижу, что это
event.data
естьnull
, с самого начала.3. Я думаю, что что-то не так с реализацией, можете ли вы вместо этого попробовать django-webpush ?
4. @Salva Спасибо за предложение, я обнаружил некоторые различия в отношении
p256dh
, которые помогли мне понять, что они означают. Однако на данный момент мне не удаетсяdjango-webpush
работать (за некоторымAppRegistryNotReady
исключением), и это не совсем соответствует моей модели данных прямо сейчас. Я буду продолжать пытаться.
Ответ №1:
Похоже, что реализация django-push-уведомлений не поддерживает веб-push-шифрование, которое требуется для отправки информации с сервера клиенту (согласно Google, а также Mozilla).
Это означает, что либо я меняю другую реализацию (например, django-webpush
как предложил @Salva), либо добавляю поддержку для этого в django-push-notifications
.
Я, честно говоря, думаю, что это проблема, но я не совсем уверен.
Редактировать: Третий вариант, использовать мой собственный с помощью pywebpush
. Учитывая, что у меня уже был материал JS, это было не так сложно. Если бы мне пришлось начинать все сначала, возможно, я бы присмотрелся поближе к django-webpush
.