Могу ли я использовать облачный обмен сообщениями firebase без разрешения на уведомление? (Javascript)

Обновление: описание отчета об ошибках Google

(как было предложено адвокатом разработчиков Google в комментариях к ответу 1, отправил отчет об ошибке; обновил содержание здесь, поскольку оно более лаконично и точно описывает проблему)

Мне не нужно и не хочу показывать пользователю какие-либо уведомления. И многие пользователи не хотят давать разрешение на уведомления, потому что предполагают, что они начнут видеть уведомления.

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

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

Но разве это не очень распространенный «вспомогательный вариант использования» обмена сообщениями, на который нацелен Firebase Messaging? Следовательно, не следует ли Google поддерживать этот вариант использования? Я не вижу каких-либо фундаментальных технических ограничителей шоу, но, поскольку Google настолько умен, пожалуйста, просветите меня, если я что-то упускаю, о том, почему этого нельзя или не следует делать.

Исходный текст вопроса StackOverflow:

Мне не нужны фоновые уведомления или сервис-воркеры. Все, что я хочу, - это отправлять данные на веб-страницу, когда она загружена и находится на переднем плане.

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

Firebase принципиально решает проблему, но я не понимаю, почему он должен требовать от пользователя предоставления разрешения на уведомления, хотя я хочу отправлять данные только при загрузке страницы; не на заднем плане.

Я столкнулся с той же проблемой, какое решение вы в конечном итоге использовали?

Jason 25.03.2019 02:06

Дорогое решение - использовать уведомления Cloud Firestore (длинный опрос, веб-сокеты) вместо Push API, когда приложение находится на переднем плане. Основная причина, по-видимому, в том, что власть имущие хотят убить веб-приложения в пользу мобильных приложений, поэтому спецификация Push API требует, чтобы пользователь получил «разрешения на показ уведомлений» от пользователя, даже если он никогда не будет показывать уведомление и просто получать асинхронные уведомления.

user2297550 25.03.2019 05:42

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

Jason 25.03.2019 13:18

@Jason См. Первый раздел кода «Web» в cloud.google.com/firestore/docs/query-data/listen. В этой схеме вы должны создать таблицу со столбцами: uid, sequence, message. Затем вы слушаете документ (uid), и по мере обновления сообщения на сервере клиент будет получать обновления в реальном времени. Как только вы усвоите это и почувствуете, что он подходит для ваших нужд, читайте дальше: cloud.google.com/firestore/docs/query-data/…

user2297550 25.03.2019 13:40

Хорошо, спасибо, поэтому другой компонент - как мне поместить сообщения с данными FCM в эту таблицу? Мое текущее облачное решение заключалось только в отправке RegistrationIds через fcm.googleapis.com/fcm/send, и никаких таблиц для этого не требовалось. Я был бы готов заплатить за ваше время, чтобы получить больше рекомендаций, вы можете связаться со мной здесь jasonsavard.com/contact

Jason 25.03.2019 14:17

@Jason необходимо добавить / изменить базу данных firestore на стороне сервера, например на Python: import firebase_admin; firebase_admin.firestore.client().collection('foo').doc('som‌​euid').set({'xyz': 'abc'}) или что-то в этом роде; я, вероятно, буду слишком дорогим, чтобы нанять специального специалиста, так что получите бесплатную помощь, пока можете ;-) в любом случае отправив электронное письмо, чтобы поддерживать связь. (также потребуется firebase_admin.initialize_app(firebase_admin.credentials.Cer‌​tificate('someprojec‌​tcredentialsjsonfile‌​.json')) перед обращением к базе данных)

user2297550 25.03.2019 16:52

Не могли бы вы дать нам ссылку на этот отчет об ошибке, чтобы мы проголосовали за него?

D2TheC 20.04.2021 12:25

@ D2TheC Вот тема из моего электронного письма, подтверждающего наличие проблемы: Re: [8-6454000024239] Веб-приложение - Невозможно заменить вариант использования WebSockets, но на всю жизнь я не могу найти средство отслеживания проблем для firebase, где это можно было бы просмотреть / отслеживаемый / проголосовавший. Можете ли вы найти его по идентификатору?

user2297550 20.04.2021 14:38

@ D2TheC также, по-видимому, член команды Google Firebase ответил на этот вопрос ниже (Дуг Стивенс), и один из способов привлечь их внимание - добавить комментарий к его ответу и посмотреть, поддаются ли они убеждению.

user2297550 20.04.2021 14:42
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
20
9
4 074
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Учитывая это, приглашение необходимо, потому что браузер не знает, что вы собираетесь делать с этим push-сообщением. Если пользователь не доверяет вашему приложению, он должен иметь право ограничивать его действия, особенно когда он не использует ваше приложение. Так же обстоят дела с мобильными операционными системами (iOS, Android).

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

user2297550 21.11.2018 02:23

Не стесняйтесь отправлять отчет об ошибке, если считаете, что он делает неправильные вещи. firebase.google.com/support/contact/bugs-features

Doug Stevenson 21.11.2018 02:40

Не осознавал, что вы защитник разработчиков. Я отправил отчет, как вы предложили, и обновил текст вопроса, добавив более точное описание проблемы. Не могли бы вы сообщить мне, что, по крайней мере, вы понимаете проблему (в моем исправленном, точном описании). Я был бы признателен, если бы вы могли попросить одного из инженеров высказаться по этому поводу. Ключ в том, что мне нужен push, но мне не нужно показывать уведомления, и многие пользователи запрещают разрешения на уведомления, потому что они разумно ожидают, что начнут видеть уведомления, которые мне не нужно показывать.

user2297550 21.11.2018 04:28

Да, я надеюсь, что это произойдет в результате вашего обращения в службу поддержки.

Doug Stevenson 21.11.2018 04:31

спасибо - игнорируйте это, так как я могу переоценить суть. Кроме того, чтобы ответить на ваш ответ - запуск сервис-воркера для получения сообщений технически не имеет ничего общего с отображением уведомлений. Я мог получать сообщения, и единственным действием было бы либо связываться с кодом веб-страницы, если он активен, либо ничего не делать. Уведомления, видимые пользователем, ** ортогональны ** / не зависят от получения сообщений. Правильно?

user2297550 21.11.2018 04:31

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

Doug Stevenson 21.11.2018 04:32

(Спасибо за вашу помощь.) Да, очень вероятно. Я хочу сказать, что «прикрытие базы» имеет обратную сторону: значительная часть пользователей просто запрещает переход на активные веб-страницы. Я уверен, что это повлияет на большую базу пользователей, кроме меня. Если вы похожи на меня, вы, вероятно, слишком часто нажимаете «нет» при изучении нового веб-сайта, который сразу же просит показывать уведомления при первом посещении.

user2297550 21.11.2018 04:38

Один из вариантов - использовать Firebase Real-time Database или Cloud Firestore в качестве системы доставки сообщений. Поскольку вам не нужен фоновый обмен сообщениями, просто напишите в базу данных, и ваше передовое приложение получит обновление.

Arthur Thompson 21.11.2018 05:29

@ArthurThompson Спасибо. Я успешно закодировал предложенное вами решение, и я могу использовать Cloud Firestore в качестве системы доставки сообщений, не прося пользователей предоставить ненужное разрешение «Показывать уведомления». Проблема в том, что Firestore очень дорог по сравнению с обменом сообщениями, потому что это, прежде всего, супер-умная база данных.

user2297550 25.11.2018 09:33

@DougStevenson, пожалуйста, посмотрите мой ответ / предложение еще раз (выше) после того, как много воды утекло под пресловутым мостом. Запрос функции не прошел, как ожидалось. Как я диагностировал ранее, есть и другие способы, помимо Push API, для доставки обновлений в реальном времени, которые не требуют предоставления специальных разрешений. Возможно, команда могла бы рассмотреть возможность их предложения (простые веб-сокеты или даже длинный опрос).

user2297550 20.04.2021 14:41

Уведомления @DougStevenson для приложения и уведомления для пользователя должны быть разными вещами. Другие службы, такие как Azure SignalR (без сокетов) и служебная шина Azure, могут предложить эту функцию.

D2TheC 20.04.2021 14:51
Ответ принят как подходящий

Проблема в том, что Firebase Messaging использует только 1 метод доставки уведомлений. Это спецификация спецификации Push API, и эта спецификация (ошибочно и к сожалению) не позволяет сервисному работнику получать сообщения без разрешения пользователя не связанный для уведомлений показывать.

Исправление было бы для команды Firebase Messaging, чтобы предоставить другой способ доставки сообщений на активные веб-страницы - длинный опрос или веб-сокеты.

Но для них это будет лишняя работа, и может быть недостаточно людей ее просят.

Другие вопросы по теме