Google Chrome: DOMException: регистрация не удалась - манифест пуст или отсутствует

Я пытаюсь реализовать Push-уведомления на своем веб-сайте (используя Pushpad). Поэтому я создал "manifest.json" со следующим содержимым:

{
    "gcm_sender_id": "my_gcm_sender_id",
    "gcm_user_visible_only": true
}

конечно, я создал действительный аккаунт GCM и у меня есть идентификатор отправителя

Я поместил manifest.json в свой корневой каталог, а также добавил эту строку в свой index.php:

<link rel="manifest" href="/manifest.json">

Используя Firefox, все работает нормально, и я могу отправлять и получать push-уведомления (поэтому я думаю, что manifest-include работает нормально), но Chrome не работает...

Консоль показывает следующую ошибку:

Uncaught (in promise) DOMException: Registration failed - manifest empty or missing

Я долго искал в гугле и перепробовал все, что нашел, но ничего не работает.

Что я пробовал:

  1. создал manifest.json с помощью «Редактора» и сохранил его как тип Все типы (поэтому нет скрытого файла .txt), а также с < em>UTF-8-Кодировка.
  2. перезапустил Chrome
  3. очистил кеш, историю и т. д. Chrome.

Я очень надеюсь, что кто-то может мне помочь.


person Fabian H.    schedule 19.05.2016    source источник
comment
Firefox работает, потому что ему не требуется манифест для включения push-уведомлений. Можете ли вы попробовать загрузить манифест прямо в свой браузер, чтобы увидеть, действительно ли вы можете получить к нему доступ?   -  person Marco Castelluccio    schedule 20.05.2016
comment
Да, я вижу код, когда загружаю его в свой браузер по прямой ссылке.   -  person Fabian H.    schedule 20.05.2016
comment
Я подтверждаю, что Firefox не ищет файл манифеста, поэтому он работает. Вы пытались ввести в адресной строке URL-адрес https://yourwebsite.com/manifest.jsonи посмотреть, правильно ли он возвращается? Можете дать ссылку на ваш сайт?   -  person collimarco    schedule 20.05.2016
comment
Да, я ввел этот URL, и он работает нормально. Я также внедрил скрипт в раздел заголовка моей страницы, который предоставляется Pushpad (он предназначен для регистрации сервис-воркера и функций Pushpad). Когда я удаляю этот скрипт, ошибок не возникает. Итак, я думаю, что регистрация сервис-воркера не удалась (?), но я действительно не знаю, почему.   -  person Fabian H.    schedule 20.05.2016
comment
Скрипт: (function(p,u,s,h,x){p.pushpad=p.pushpad||function(){(p.pushpad.q=p.pushpad.q||[]).push(arguments )};h=u.getElementsByTagName('head')[0];x=u.createElement('script');x.async=1;x.src=s;h.appendChild(x);})( window,document,'pushpad.xyz/pushpad.js'); pushpad('init', project_id); кнопка('Подписаться');   -  person Fabian H.    schedule 20.05.2016
comment
@ФабианХ. Да, эта ошибка определенно связана с Push API. Вы уверены, что используете правильный идентификатор отправителя GCM, а не секретный токен GCM? Ваш веб-сайт обслуживается через HTTPS (или даже HTTP, но в этом случае домен должен быть точно localhost) ? Можете ли вы предоставить ссылку на веб-сайт или разместить страницу в Интернете, чтобы воспроизвести проблему?   -  person collimarco    schedule 23.05.2016
comment
@ФабианХ. Еще одно предположение: вы уверены, что у вас есть / перед manifest.json? Попробуйте открыть вкладку сети инструментов разработчика Chrome и посмотреть, успешно ли выполнен запрос manifest.json.   -  person collimarco    schedule 23.05.2016
comment
Да, я использую правильный отправитель GCM, и сайт обслуживается через HTTPS. Я провел некоторое тестирование, и мне удалось заставить его работать :-) Перед тегом <head> был включен некоторый php-код (например, для подключения к базе данных). После того, как я переместил эти включения ниже тега <head>, все заработало нормально.   -  person Fabian H.    schedule 23.05.2016
comment
@collimarco Спасибо за поддержку :-)   -  person Fabian H.    schedule 24.05.2016
comment
Я получал ту же ошибку, когда манифест загружался из домена, отличного от главной страницы.   -  person Martin Ždila    schedule 30.06.2016


Ответы (7)


Для меня это был редирект. manifest.json должен возвращать код состояния 200 (должен быть доступен напрямую с сервера) без каких-либо перенаправлений. Вы можете проверить ответ через

wget --max-redirect=0 https://example.com/manifest.json

or

curl https://example.com/manifest.json

person Sudhanshu    schedule 26.10.2016

Я столкнулся с той же проблемой, добавил файл манифеста сразу после тега заголовка. который работал для меня. Ура!

person Shreekanta    schedule 07.12.2016
comment
Это сработало и для меня, за исключением того, что я поместил ‹ссылку› manifest.json прямо перед закрывающим тегом ‹/head›. - person cellen; 18.01.2017

Это может быть проблема с вашей областью Service Worker. Я столкнулся с подобной проблемой, когда переставлял свои файлы/каталоги. Убедитесь, что ваш sw.js находится на том же уровне, что и manifest.json, иначе сервисный работник не сможет найти ваш манифест. Попробуйте поместить их оба в корень вашего каталога. При желании вы можете указать scope вашего сервис-воркера, добавив его в serviceWorker.register():

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw-test/sw.js', {scope: '/sw-test/'})
  .then(function(reg) {
    // registration worked
    console.log('Registration succeeded. Scope is ' + reg.scope);
  }).catch(function(error) {
    // registration failed
    console.log('Registration failed with ' + error);
  });
}

Подробнее читайте здесь: https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers

person Trob Frank    schedule 11.05.2017

Интересно, общедоступен ли ваш «manifest.json»?

Если нет, возможно, вы можете попробовать сделать его общедоступным, чтобы увидеть, поможет это или нет.

И кажется, что текущий хром при получении «manifest.json» не будет предоставлять файлы cookie.

person Tom Tang    schedule 06.07.2016

Поскольку я нигде не нашел ответа в WWW, но через некоторое время мне удалось заставить его работать, я хочу предоставить свое решение/ответ другим пользователям, у которых, вероятно, такая же проблема:

В файле, в который я включил файлы Pushpad, я написал некоторый PHP-код перед тегом <head>, чтобы включить некоторые файлы, например. для подключения к базе данных. После того, как я переместил PHP-код ниже тега <head>, все заработало нормально.

person Fabian H.    schedule 30.10.2017

Кажется, есть три способа исправить эту ошибку: а) Нет перенаправлений для файла «manifest.json». б) Поместите ссылку на этот файл вверху тега. в) Убедитесь, что перед этим нет другого файла манифеста, потому что кажется, что скрипт веб-пуша попытается импортировать первый и вернет ошибку из-за неправильных данных. Я пробовал все три и, наконец, заставил Chrome вести себя.

person Łukasz P    schedule 19.12.2018

Добавление следующего блока исправило это для меня:

self.addEventListener('push', (event) => {
  const title = 'Get Started With Workbox';
  const options = {
    body: event.data.text()
  };
  event.waitUntil(self.registration.showNotification(title, options));
});
person jsbisht    schedule 03.10.2020