Как подписаться на pushManager через iframe в Chrome?

Я могу зарегистрировать сервисного работника через iframe. Когда я пытаюсь запустить "pushManager.subscribe", у меня есть:

DOMException: Registration failed - permission denied

Эта проблема только в Chrome через iframe. Он хорошо работает в Firefox. И он хорошо работает без iframe в Chrome.


person Katerina Sozykina    schedule 25.10.2016    source источник


Ответы (3)


Короче говоря, вы не можете! Путь, по которому вы регистрируете работника службы, должен быть открыт (должен быть доменом верхнего уровня), чтобы он мог зарегистрировать работника службы. Один из способов добиться этого:

предположим, что ваш iframe выглядит так:

 <iframe src="https://example.com"></iframe>

используйте postMessage для связи с iframe и запросите разрешение, а затем window.open("https://example.com/") для регистрации сервис-воркера и получения токена.

Надеюсь это поможет :)

person Dhruv Batheja    schedule 26.10.2016

Вы не можете использовать iframe, это не разрешено.

Запрос разрешения должен выполняться из окна верхнего уровня.

Единственная альтернатива (которую мы использовали, например, для Pushpad Express) — это перенаправить/открыть новое окно из iframe, затем запросить разрешение у окна верхнего уровня и, наконец, перенаправить обратно.

Это сделано для того, чтобы пользователю было понятно, какой веб-сайт запрашивает разрешение на push-уведомления. В противном случае есть опасение, что реклама, например, может отображать подсказку для push-уведомлений, и это может ввести в заблуждение.

Кстати, я также предложил добавить новое значение в атрибут sandbox для iframes, чтобы разрешить подсказки для push-уведомлений, но спецификация в настоящее время не поддерживает это.

person collimarco    schedule 26.10.2016
comment
у вас есть пример? - person Muhaimin CS; 19.11.2019

Chrome требует, чтобы вы подписывались на push-уведомления из домена верхнего уровня, поскольку в противном случае менее ясно, откуда исходит пользователь, разрешающий push-уведомления.

person Miguel Garcia    schedule 25.10.2016
comment
Делаю приложение для фейсбука: https://apps.facebook.com/xxxxxxx/ - адрес приложения; https://app.example.com/fb/build/ - адрес iframe. Что вы имеете в виду, когда говорите о домене верхнего уровня? Вы имеете в виду, что Chrome требует подписки для отправки из https://apps.facebook.com/xxxxxxx/. Или мне нужно изменить адрес для iframe на https://app.example.com/ и поместить туда serviceWorker. - person Katerina Sozykina; 26.10.2016
comment
Я не знаю точно, как работают приложения facebook. Вы должны вызвать подписку из любого источника, отображаемого в строке URL-адреса, когда вы просматриваете страницу. - person Miguel Garcia; 27.10.2016