Не удается использовать PushAPI на macOS Safari, возвращаемый конечный пункт – пустая строка.

Вопрос или проблема

Мой код работает отлично локально и в продакшене на Chrome.

Это моя функция Subscribe(), которая запускается в браузере, когда пользователь хочет включить уведомления (я не использую сервис APN от Apple, а стандартный PushAPI).

export function Subscribe(vapid: string): Promise<PushSubscription> {
    return new Promise((resolve, reject) => {
        if (!vapid) {
            reject("VAPID не объявлен")
        }

        navigator.serviceWorker.getRegistration()
        .then((registration) => {  
            if (!registration) {
                return
            }
            registration.pushManager.subscribe({
                userVisibleOnly: true,
                applicationServerKey: urlBase64ToUint8Array(vapid),
            }).then((subscription) => {
                console.log(subscription)
                if (!subscription) {
                    reject(new Error("Невозможно подписаться (пустая подписка)"))
                }
                if (subscription.endpoint === "") {
                    reject(new Error("Невозможно подписаться (пустой endpoint)"))
                }
                resolve(subscription)
            })
        })
        .catch((err) => {
            reject(err)
        });
    })
}

Браузер запрашивает разрешение у пользователя, с этим проблем нет, затем, при попытке подписаться, получаем такой payload :

PushSubscription {endpoint: "", expirationTime: null, options: PushSubscriptionOptions, getKey: function, unsubscribe: function, …}

Строковый вид:

{
  "keys":{
    "p256dh":"",
    "auth":""
  }
}

Как видите, ошибки нет, но endpoint пуст, как и ключи.

  • На другой машине работает, когда я прошу кого-то протестировать
  • Я могу использовать эту тестовую страницу без проблем: https://www.bennish.net/web-notifications.html (но я не мог, пока не удалил ~/Library/Safari/RemoteNotifications/Permissions.plist), но, думаю, она использует другой API, и это не серверные уведомления.
  • Я не могу использовать следующий сайт https://cleverpush.com/en/test-notifications/, я получаю предупреждение “undefined” при отправке уведомления. В отладчике я вижу сходства с payload, отправляемым на их сервер:
{
  "endpoint":"",
  "publicKey":"",
  "authSecret":""
}

Похоже, это странная проблема в моей системе, но я не могу понять, в чем дело.

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

Ответ или решение

Проблема, с которой вы столкнулись, связана с использованием Push API в браузере Safari на macOS. Несмотря на то, что ваш код прекрасно работает в Chrome и другом окружении, при тестировании в Safari вы получаете пустую строку для endpoint и отсутствующие ключи в PushSubscription. Давайте подробно разберем возможные причины и шаги решения этой проблемы.

Причины возникновения проблемы:

  1. Кросс-браузерная совместимость: Safari может иметь особенности реализации Push API, которые отличаются от других браузеров, таких как Chrome. Убедитесь, что ваш код соответствует спецификациям Push API для Safari.

  2. Настройки Safari и разрешения: Несмотря на то, что браузер запрашивает разрешение на получение уведомлений, настройки приватности или защита от трекеров могут блокировать корректную функциональность Push API. Проверьте, не включены ли режимы, такие как "Безопасный режим" или "Запрет на отслеживание".

  3. Сертификаты и HTTPS: Проверьте, работаете ли вы с HTTPS-соединениями. Safari требует, чтобы все push-уведомления отправлялись через защищенные соединения (HTTPS). Также убедитесь, что у вас правильно настроены сертификаты.

  4. Кэш и хранилище данных: Возможно, что предыдущие разрешения или настройки кэша препятствуют корректной работе Push API. Удаление ~/Library/Safari/RemoteNotifications/Permissions.plist помогло бы сбросить эти настройки, но могут быть другие кэши, которые мешают.

  5. Политики управления предприятия: Если ваш компьютер находится под управлением корпоративной IT-службы, возможно, существуют скрытые политики, которые не позволяют использовать Push API или ограничивают его использование определённым образом.

Рекомендации по решению проблемы:

  1. Проверка кода: Убедитесь, что код функции Subscribe() соответствует стандартам на момент тестирования. Обратите внимание на используемые параметры и правильность передачи VAPID-ключа.

  2. Очистка кэша: Попробуйте удалить не только указанный вами файл, но и сбросьте кэш Safari:

    • Перейдите в "Safari" → "Настройки" → "Конфиденциальность" → "Управление данными сайтов" и удалите все данные или выберите конкретные сайты.
    • Также можно попробовать полный сброс настроек браузера.
  3. Тестирование на других машинах: Проведите тестирование на других устройствах, используя аналогичные окружения (версия macOS, Safari и т.д.), чтобы исключить возможность аппаратных особенностей.

  4. Логи и отладка: Используйте инструменты разработчика в Safari для отслеживания сетевых запросов и консольных сообщений. Это может помочь локализовать проблему и понять, на каком этапе возникает ошибка.

  5. Обратитесь в IT-поддержку: Обсудите вашу проблему со службой поддержки, чтобы исключить вероятность наличия скрытых политик, которые могут блокировать Push API.

Заключение

Проблема с пустым endpoint при использовании Push API в Safari может быть вызвана несколькими факторами, включая настройки браузера, конфигурацию сети и корпоративные политики. Следуя приведенным рекомендациям, вы сможете более эффективно локализовать и устранить проблему. Если все вышеупомянутое не решает вашу проблему, возможно, стоит обратиться к разработчикам Apple или на специализированные форумы для получения дополнительной помощи.

Оцените материал
Добавить комментарий

Капча загружается...