Обновление: описание отчета об ошибках Google
(как было предложено адвокатом разработчиков Google в комментариях к ответу 1, отправил отчет об ошибке; обновил содержание здесь, поскольку оно более лаконично и точно описывает проблему)
Мне не нужно и не хочу показывать пользователю какие-либо уведомления. И многие пользователи не хотят давать разрешение на уведомления, потому что предполагают, что они начнут видеть уведомления.
Но я хочу отправить данные на свою веб-страницу с сервера. Веб-страница активна и находится на переднем плане. Это классический вариант использования, для которого были разработаны веб-сокеты.
Я понимаю, что мог бы написать свой собственный сервер веб-сокетов и как-то попытаться его масштабировать или обратиться к другому стороннему поставщику за масштабируемым решением push-уведомлений веб-сокетов.
Но разве это не очень распространенный «вспомогательный вариант использования» обмена сообщениями, на который нацелен Firebase Messaging? Следовательно, не следует ли Google поддерживать этот вариант использования? Я не вижу каких-либо фундаментальных технических ограничителей шоу, но, поскольку Google настолько умен, пожалуйста, просветите меня, если я что-то упускаю, о том, почему этого нельзя или не следует делать.
Исходный текст вопроса StackOverflow:
Мне не нужны фоновые уведомления или сервис-воркеры. Все, что я хочу, - это отправлять данные на веб-страницу, когда она загружена и находится на переднем плане.
Веб-сокеты не нуждаются в каких-либо разрешениях, но им нужен сервер веб-сокетов и обслуживание. Масштабировать это сложно или дорого.
Firebase принципиально решает проблему, но я не понимаю, почему он должен требовать от пользователя предоставления разрешения на уведомления, хотя я хочу отправлять данные только при загрузке страницы; не на заднем плане.
Дорогое решение - использовать уведомления Cloud Firestore (длинный опрос, веб-сокеты) вместо Push API, когда приложение находится на переднем плане. Основная причина, по-видимому, в том, что власть имущие хотят убить веб-приложения в пользу мобильных приложений, поэтому спецификация Push API требует, чтобы пользователь получил «разрешения на показ уведомлений» от пользователя, даже если он никогда не будет показывать уведомление и просто получать асинхронные уведомления.
Вы знаете какой-нибудь пример этого кода? Не могли бы вы помочь мне в дальнейшем, если у вас есть в этом опыт.
@Jason См. Первый раздел кода «Web» в cloud.google.com/firestore/docs/query-data/listen. В этой схеме вы должны создать таблицу со столбцами: uid, sequence, message. Затем вы слушаете документ (uid), и по мере обновления сообщения на сервере клиент будет получать обновления в реальном времени. Как только вы усвоите это и почувствуете, что он подходит для ваших нужд, читайте дальше: cloud.google.com/firestore/docs/query-data/…
Хорошо, спасибо, поэтому другой компонент - как мне поместить сообщения с данными FCM в эту таблицу? Мое текущее облачное решение заключалось только в отправке RegistrationIds через fcm.googleapis.com/fcm/send, и никаких таблиц для этого не требовалось. Я был бы готов заплатить за ваше время, чтобы получить больше рекомендаций, вы можете связаться со мной здесь jasonsavard.com/contact
@Jason необходимо добавить / изменить базу данных firestore на стороне сервера, например на Python: import firebase_admin; firebase_admin.firestore.client().collection('foo').doc('someuid').set({'xyz': 'abc'}) или что-то в этом роде; я, вероятно, буду слишком дорогим, чтобы нанять специального специалиста, так что получите бесплатную помощь, пока можете ;-) в любом случае отправив электронное письмо, чтобы поддерживать связь. (также потребуется firebase_admin.initialize_app(firebase_admin.credentials.Certificate('someprojectcredentialsjsonfile.json')) перед обращением к базе данных)
Не могли бы вы дать нам ссылку на этот отчет об ошибке, чтобы мы проголосовали за него?
@ D2TheC Вот тема из моего электронного письма, подтверждающего наличие проблемы: Re: [8-6454000024239] Веб-приложение - Невозможно заменить вариант использования WebSockets, но на всю жизнь я не могу найти средство отслеживания проблем для firebase, где это можно было бы просмотреть / отслеживаемый / проголосовавший. Можете ли вы найти его по идентификатору?
@ D2TheC также, по-видимому, член команды Google Firebase ответил на этот вопрос ниже (Дуг Стивенс), и один из способов привлечь их внимание - добавить комментарий к его ответу и посмотреть, поддаются ли они убеждению.

Это сделано для защиты предпочтений пользователя в отношении того, что разрешено делать вашему приложению. В браузерах push-сообщения работают с помощью сервис-воркера. Даже если вы говорите, что вам не нужен сервисный работник, на самом деле вы используете его при использовании Firebase Cloud Messaging в своем приложении.
Учитывая это, приглашение необходимо, потому что браузер не знает, что вы собираетесь делать с этим push-сообщением. Если пользователь не доверяет вашему приложению, он должен иметь право ограничивать его действия, особенно когда он не использует ваше приложение. Так же обстоят дела с мобильными операционными системами (iOS, Android).
Кажется, разрешение на уведомления должно вступать в игру только тогда, когда мой код пытается показать уведомление. Если сервисный работник потребляет сообщения, ничего не делая с ними, для этого не требуется разрешение на уведомления.
Не стесняйтесь отправлять отчет об ошибке, если считаете, что он делает неправильные вещи. firebase.google.com/support/contact/bugs-features
Не осознавал, что вы защитник разработчиков. Я отправил отчет, как вы предложили, и обновил текст вопроса, добавив более точное описание проблемы. Не могли бы вы сообщить мне, что, по крайней мере, вы понимаете проблему (в моем исправленном, точном описании). Я был бы признателен, если бы вы могли попросить одного из инженеров высказаться по этому поводу. Ключ в том, что мне нужен push, но мне не нужно показывать уведомления, и многие пользователи запрещают разрешения на уведомления, потому что они разумно ожидают, что начнут видеть уведомления, которые мне не нужно показывать.
Да, я надеюсь, что это произойдет в результате вашего обращения в службу поддержки.
спасибо - игнорируйте это, так как я могу переоценить суть. Кроме того, чтобы ответить на ваш ответ - запуск сервис-воркера для получения сообщений технически не имеет ничего общего с отображением уведомлений. Я мог получать сообщения, и единственным действием было бы либо связываться с кодом веб-страницы, если он активен, либо ничего не делать. Уведомления, видимые пользователем, ** ортогональны ** / не зависят от получения сообщений. Правильно?
Я предполагаю, что логика браузера такова, что если вы намереваетесь получать push-сообщения, он предполагает, что вы мая также пытаетесь показать видимое уведомление, но он не может знать наверняка, поэтому он просто покрывает основу.
(Спасибо за вашу помощь.) Да, очень вероятно. Я хочу сказать, что «прикрытие базы» имеет обратную сторону: значительная часть пользователей просто запрещает переход на активные веб-страницы. Я уверен, что это повлияет на большую базу пользователей, кроме меня. Если вы похожи на меня, вы, вероятно, слишком часто нажимаете «нет» при изучении нового веб-сайта, который сразу же просит показывать уведомления при первом посещении.
Один из вариантов - использовать Firebase Real-time Database или Cloud Firestore в качестве системы доставки сообщений. Поскольку вам не нужен фоновый обмен сообщениями, просто напишите в базу данных, и ваше передовое приложение получит обновление.
@ArthurThompson Спасибо. Я успешно закодировал предложенное вами решение, и я могу использовать Cloud Firestore в качестве системы доставки сообщений, не прося пользователей предоставить ненужное разрешение «Показывать уведомления». Проблема в том, что Firestore очень дорог по сравнению с обменом сообщениями, потому что это, прежде всего, супер-умная база данных.
@DougStevenson, пожалуйста, посмотрите мой ответ / предложение еще раз (выше) после того, как много воды утекло под пресловутым мостом. Запрос функции не прошел, как ожидалось. Как я диагностировал ранее, есть и другие способы, помимо Push API, для доставки обновлений в реальном времени, которые не требуют предоставления специальных разрешений. Возможно, команда могла бы рассмотреть возможность их предложения (простые веб-сокеты или даже длинный опрос).
Уведомления @DougStevenson для приложения и уведомления для пользователя должны быть разными вещами. Другие службы, такие как Azure SignalR (без сокетов) и служебная шина Azure, могут предложить эту функцию.
Проблема в том, что Firebase Messaging использует только 1 метод доставки уведомлений. Это спецификация спецификации Push API, и эта спецификация (ошибочно и к сожалению) не позволяет сервисному работнику получать сообщения без разрешения пользователя не связанный для уведомлений показывать.
Исправление было бы для команды Firebase Messaging, чтобы предоставить другой способ доставки сообщений на активные веб-страницы - длинный опрос или веб-сокеты.
Но для них это будет лишняя работа, и может быть недостаточно людей ее просят.
Я столкнулся с той же проблемой, какое решение вы в конечном итоге использовали?