Service Worker clients.openWindow открывает start_url из манифеста вместо запрошенного URL

У меня есть работник службы, который получает push-уведомления, и он хорошо работает в Chrome для ПК, но не в Chrome для Android.

Иногда он работает так, как ожидалось, но иногда начинает открывать значение start_url файла manifest.json вместо значения переменной notificationURL.

URL-адрес уведомления выглядит так: https://www.example.com/abc/123/?source=notification

Значение start_url манифеста выглядит так: https://www.example.com/?source=manifest

Образец кода:

self.addEventListener('notificationclick', function(event) {

    var notificationURL = event.notification.data.url;

    event.notification.close();

    event.waitUntil(clients.matchAll({
        type: 'window'
    }).then(function(clientList) {

        for ( var i = 0; i < clientList.length; i++ ) {
            var client = clientList[i];
            if ( client.url === notificationURL && 'focus' in client ) {
                return client.focus();
            }
        }

        if ( 'openWindow' in clients ) {

            // This prints "notificationURL: https://www.example.com/abc/123/?source=notification".
            console.log('notificationURL:', notificationURL);

            // But this opens "https://www.example.com/?source=manifest".
            return clients.openWindow(notificationURL);
        }

    }));

});

Итак, по какой-то причине в некоторых случаях, если URL-адрес уведомления начинается с "https://www.example.com" приведенный выше код всегда будет открывать https://www.example.com/?source=manifest .

Это связано с тем, что я добавил сайт на свой домашний экран?

Это ожидаемое поведение?

Примечание. Он открывает манифест start_url, но не в автономном режиме.


person RockoDev    schedule 17.05.2016    source источник


Ответы (2)


Незадолго до return client.focus();

добавить эту строку

client.navigate(notificationURL);

Также измените return clients.openWindow(notificationURL)

to

return clients.openWindow(notificationURL).then(function(client){ client.navigate(notificationURL); });

person vishva8kumara    schedule 02.09.2017

Я столкнулся с аналогичной проблемой (или на самом деле, похоже, с точностью до наоборот): client.openwindow из моих push-уведомлений работал нормально, когда мне приходилось иметь дело только с браузером. Итак, http://example.com/some/path/page был открыт без каких-либо проблем.

Однако, как только кто-то установил отдельное приложение с помощью команды «добавить на рабочий стол», оно перестало работать. Приложение просто всегда будет открывать start_url независимо от того, какой URL я указал. Все перепробовала; изменение области действия в моем манифесте и обслуживающем работнике, отчаянные попытки вызвать navigate () в окне после того, как обещание openWindow было выполнено (.then () даже не был вызван wtf) и т. д. Я думаю, что прочитал весь Интернет по этой теме, но я не нашел решения ...

В конце концов, я решил изменить display: "standalone" на display: "browser" в моем манифесте. И ссылки снова заработали! Конечно, это меняет поведение вашего приложения и делает его непригодным (оно становится больше похоже на ярлык на веб-страницу), но для меня это был приемлемый обходной путь, решивший проблему.

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

person Harrie Verveer    schedule 01.07.2016
comment
Я нашел другой обходной путь. Если URL-адрес, который я пытаюсь открыть, имеет ту же схему и хост, что и start_url, он открывает start_url. Но если я изменю схему (https) на http, откроется правильный URL-адрес, и мой сервер выполнит перенаправление на https. Но это связано с некоторыми проблемами безопасности ... - person RockoDev; 01.07.2016