Это почти наверняка дело самого Discourse. Они просто не отправляют уведомления, если вы заходили на сайт определённое количество минут назад. Но так как у конечных пользователей нет возможности это увидеть, это делает уведомления ненадёжными. Однако я заверяю вас: я получил iOS-уведомления для обоих этих сообщений. Они могут работать, но только при условии, что вы никогда не будете им доверять.
Думаю, проблема наоборот. Если я недостаточно часто пользуюсь сайтом со своего телефона, уведомления перестают приходить.
Возможно, но мы все лишь гадаем. Главное, что нам нужно, — это чтобы Discourse обеспечивал адекватное ведение логов для конечных пользователей. Какие уведомления отправил Discourse? Какие уведомления Discourse решил не отправлять?
Когда PWA получает уведомление, оно может сохранить локальный лог этого события в IndexedDB на устройстве. Пользователи должны иметь возможность просматривать этот лог и сопоставлять его с логом сервера, чтобы увидеть, отправлял ли Discourse push-уведомление, но устройство его не получило.
В целом, я бы сказал: не предполагайте, что проблема в Apple, и особенно не полагайте, что простое ожидание iOS 18 поможет. Discourse должен предпринять действия здесь, иначе ничего не изменится к лучшему.
Мне это кажется очень-очень подробным логированием:
Добавить подробный лог здесь, вероятно, довольно просто:
«Пропущено уведомление Сэма о “payload”, так как Сэм был онлайн».
Но если вы просто хотите отладить это, почему бы не установить SiteSetting.push_notification_time_window_mins в 0?
А затем следующий уровень логирования станет очень-очень подробным:
- Пропущено уведомление, так как у пользователя включён режим «Не беспокоить».
- Тайм-аут у провайдера push-уведомлений: discourse/app/services/push_notification_pusher.rb at cacaa90f4d01452358322ea8b5564f15f4816c74 · discourse/discourse · GitHub
- Истёк срок действия подписки.
- Ошибка ответа.
Многие разные вещи могут пойти не так… хотя в любой момент времени вы, вероятно, можете использовать DE для проверки: посмотрите в таблице push_subscriptions на актуальные подписки на web push.
Позвольте мне начать с того, что, на мой взгляд, проблема заключается в том, что люди пишут здесь и на моём форуме: «Я считаю, что push-уведомления работают неправильно», а другие пользователи поддерживают их, говоря: «Да! У меня тоже! Уведомления должны быть сломаны/ненадёжны». Иногда они винят Apple, иногда — Discourse, но все сходятся во мнении, что push-уведомления в Discourse ненадёжны.
Я бы с радостью мог сам расследовать такие случаи, говоря: «Вы не получили уведомление в 12:31 на своём телефоне, и вот почему…», но я не верю, что это в настоящее время возможно.
Да, может пойти не так множество разных вещей, включая проблемы на стороне клиента, которые я не могу исследовать в DE.
- Получил ли Service Worker событие push?
- Вызвал ли Service Worker
showNotification? - Было ли предоставлено разрешение на
showNotification, илиshowNotificationне привело к никакому результату? - Установлено ли на самом устройстве режим «Не беспокоить»?
Мне бы очень хотелось иметь документацию для администраторов, объясняющую, как использовать DE для диагностики сбоя push-уведомлений, хотя бы в части проверки, дошло ли уведомление.
Но я также считаю, что было бы невероятно полезно вести журнал на стороне клиента, который пользователи могли бы отправлять мне, что позволило бы мне сопоставить его с журналом DE.
Во-первых, как минимум половина людей, жалующихся на это, не являются администраторами своего форума. Вот почему нам нужно, чтобы Discourse реализовал это:
Но, да, я подозреваю, что установка этого значения в 0 устранит 80% жалоб на «это не работает».
В целом, доверие пользователей к уведомлениям Discourse довольно низкое. Чем больше эта проблема будет поддаваться исследованию для администраторов (и даже для конечных пользователей), тем более надёжными будут казаться уведомления Discourse.
Я немного запутался в этом фрагменте: мы отправляем push-уведомление напрямую на URL с сервера…
Вот моя логика. Посмотрите, что говорят пользователи в этой теме.
Эти сообщения, похоже, подразумевают, что проблема может быть на стороне Apple. Возможно, Discourse действительно отправляет запрос на URL, но по какой-то причине Apple не доставляет push-уведомление. Почему так может происходить?
- Возможно, Apple возвращает код 4xx или 5xx для задачи push-уведомления, и Discourse должен повторить отправку.
- Возможно, Apple получила сообщение, но не может (или не хочет?) доставить его на устройство.
- Возможно, устройство получило сообщение, но Apple не вызывает событие
pushдля сервисного воркера. - Возможно, сервисный воркер получил событие
push, но из-за бага не вызвалshowNotification(скорее всего, это не оно, иначе ошибка была бы слишком очевидной…?) - Возможно, сервисный воркер получил событие
pushи вызвалshowNotification, но Apple отказалась показывать видимое уведомление. На самом деле существует множество причин для этого:- Устройство установлено в режим «Не беспокоить» (но в этом случае уведомление, думаю, должно eventually появиться в Центре уведомлений)
- Разрешение было предоставлено ранее, но сейчас отозвано (PWA может обнаружить этот случай и записать его в лог!)
- Пользователь мог настроить приложение со странными параметрами уведомлений, так что оно, например, отправляет уведомления только в Центр уведомлений, но не показывает баннер
- … или Apple отказывается показывать сообщение по какой-то другой политике (возможно, они считают уведомление спамом?), и, возможно, в будущей версии iOS они станут более сговорчивыми
И это ещё не учитывая все причины, по которым сам Discourse может не отправить уведомление (режим «Не беспокоить», фильтры push-уведомлений, push_notification_time_window_mins).
Если всё, что мы можем сказать: «Ну, в 12:31 Discourse отправил уведомление с ID XXX в Apple, и Apple вернула статус 201 Created, но мы не знаем, что произошло дальше», — тогда у этих пользователей и администраторов не будет возможности провести дальнейшее расследование. Нам останется только винить Apple и отказаться от push-уведомлений. («Возможно, в 2024 году веб-уведомления на iOS 18 всё же заработают».)
Вместо этого нам нужно иметь возможность сказать: «Ваши логи на устройстве показывают, что в 12:33 сервисный воркер активировался по событию push для уведомления с ID XXX, вызвал showNotification, и мы видим через Notification API, что Apple подтверждает, что разрешение на showNotification для этого push-уведомления XXX было предоставлено».
(Я также считаю, что на странице https://meta.discourse.org/my/preferences/notifications должна быть кнопка «Отправить тестовое уведомление», которая позволяет запланировать уведомление на будущее, например, через N минут или N часов, чтобы пользователи могли протестировать случай «не работает через несколько часов».)
С моей стороны я не смог воспроизвести это на моём тестовом сайте. Уведомления там работают без проблем. Проблема возникает на моём рабочем сайте. Уведомления перестают работать через несколько часов каждый раз, когда я их включаю. Моя единственная теория заключается в том, что, возможно, проблема в объёме push-уведомлений? Мой рабочий сайт очень активен и имеет более 50 тысяч участников, поэтому отправляется много уведомлений на мой пользовательский аккаунт (и в целом).
Итак, я и @WorldIsMine провели небольшой эксперимент.
- Мы ждали, пока у него перестанут работать уведомления.
- Проверили, что его подписка на push-уведомления всё ещё есть в таблице
push_subscriptions
- Я отправил push-уведомление из консоли Rails и записал все исключения в лог.
u = User.find(1)
payload = { excerpt: "Test", "translated_title": "Test!" }
PushNotificationPusher.push(u, payload)
- Исключений не было.
- Он не получил уведомление.
- (Для перепроверки я смог отправить push-уведомление себе).
Получается, проблема на стороне Apple? Что это может быть?
У вас есть доступ к Mac для тестирования в Safari на macOS? Вы сможете настроить инструменты разработчика для отладки сервисного воркера там.
Насколько я понимаю, здесь не задействован сервисный воркер.
Нет, все веб-пуш-уведомления на iOS требуют наличия сервис-воркера. Sending web push notifications in web apps and browsers | Apple Developer Documentation
Ладно, это выше моего понимания. К сожалению, у меня нет опыта работы с этим на стороне клиента и нет под рукой Mac.
По крайней мере, мы исключили серверную часть.
Ага! Кажется, я нашел хотя бы одну ошибку с этим и создал отдельную тему.
Насколько я надеялся, что ваше исправление улучшит ситуацию, я всё ещё не уверен.
Meta была развернута с этим исправлением уже неделю. Я включил живые уведомления в PWA на своём iPhone. Сегодня они просто перестали работать.
Оно было создано 5 января.
Я попробую отладить это с помощью скрипта, чтобы понять, что вызывает сбой и как долго он длится, но многое указывает на то, что у Apple просто есть какой-то баг.
Чем больше я об этом думаю, тем больше убеждаюсь, что Discourse Hub теперь является решением для устройств Apple.
Спасибо, что отслеживаете это!
Вы переходили по каким-либо уведомлениям? Я спрашиваю, потому что интересно, не отключает ли Apple автоматически веб-уведомления, если вы получили определенное количество из них, ни на одно из которых не нажали.
Нам всё ещё нужны эти функции для анализа сбоев:
- Инструкции по использованию Data Explorer для просмотра истории push-уведомлений.
- Логи на устройстве, чтобы мы могли извлекать их и сопоставлять с серверными логами. Логи должны включать временные метки всех событий
push, включая полный payload, а также статусNotification.permission. - Кнопка «Отправить тестовое уведомление», которая ставит уведомление в очередь на N минут/часов в будущем.
Обратите внимание: мои PWA-уведомления стабильно работали последние 3 недели на Meta
Вот тревожное обновление, которое указывает на то, что нас ждут новые проблемы в этой сфере:
К вашему сведению, новость, о которой сообщил @nathank выше, полностью подтверждена Apple.
В откровенно злом духе соблюдения Закона ЕС о цифровых рынках (DMA), направленного на повышение открытости и конкуренции на цифровых платформах, Apple решила уничтожить PWA в ЕС с помощью предстоящего обновления Safari для iOS 17.4.
Это запретит установку PWA на главный экран, использование push-уведомлений, фоновую синхронизацию, а также нарушит работу офлайн-хранилища и другие функции. Более того, это окажет глобальное влияние, выходящее за пределы ЕС, поскольку компании будут гораздо менее склонны инвестировать в веб-приложения, и особенно в PWA, если пользователи iPhone в ЕС не смогут их использовать.
Я предполагаю, что это станет серьёзным препятствием для многих сообществ Discourse и для самого Discourse. Если это касается и вас, настоятельно рекомендую заполнить опрос от группы Open Web Advocacy. Они возглавляют борьбу с этими изменениями, информируя команду DMA обо всех последствиях этих и других политик для веб-разработки. Они срочно собирают отзывы и данные от компаний, которые пострадают от этих изменений, чтобы предоставить DMA более полную информацию для противодействия.
Пожалуйста, посетите эту страницу, чтобы узнать больше, заполните их опрос о том, как это влияет на ваш бизнес, и распространите информацию! Было бы особенно замечательно, если бы Discourse предупредил своих пользователей о предстоящих изменениях, чтобы каждый мог связаться с OWA и объяснить, как это влияет на их бизнес и сообщества.