Нет обмена данными между django-push-уведомлениями и Service Worker

#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 .