Продолжение моего однолетнего руководства «Веб-push-уведомления в прогрессивных веб-приложениях с Ionic и Angular»
Я делюсь одной уловкой в день до первоначально запланированной даты окончания карантина COVID-19 в Швейцарии, 19 апреля 2020 года. До этого первого рубежа осталось пять дней. Надеюсь, впереди лучшие дни.
Если вы следите за мной в Twitter, вы, возможно, читали, что приложение, которое я разработал и недавно отправил в магазины, было отклонено как Apple, так и Google, поскольку оно не соответствовало, по их мнению, их ограничительной политике в отношении текущего COVID- 19 пандемия.
Я пишу эти строки не для того, чтобы поделиться своим мнением об этих компаниях, а для того, чтобы поделиться продолжением моего учебника годичной давности: Веб-push-уведомления в прогрессивных веб-приложениях.
Действительно, одна из основных концепций приложения, которая была отклонена, основана на push-уведомлениях. Поскольку он разработан с использованием Ionic и Angular, мы можем реализовать прогрессивные веб-приложения, но хорошо ли поддерживается такая функция?
Вступление
Я пишу эту статью Вторник, 14 апреля 2020 года, поэтому она отражает статус этой конкретной даты. Если вы прочтете это в будущем и заметите улучшения или изменения, свяжитесь со мной!
Сегодня днем я провел тесты на своем телефоне Android, OnePlus 6 под управлением Android v10 и на моем iPhone 6s под управлением iOS 13.
Android
Это работает как шарм, и точка. Я протестировал Web Push-уведомления на своем телефоне в режиме ожидания, в спящем режиме и с открытым приложением. Во всех случаях уведомления приходили. Отличная работа Google 👍.
iOS
Веб-уведомления по-прежнему не поддерживаются на iOS. Статус не изменился с тех пор, как я опубликовал свое руководство в феврале 2019 года. Как вы можете заметить с помощью Caniuse, API уведомлений еще не реализован в iOS Safari.
Настраивать
Настройка Firebase Cloud Messaging, которую я показал в предыдущей статье, по-прежнему остается в силе. Конечно, возможно, некоторые скриншоты были изменены или актуализированы, но идея осталась прежней. Более того, я точно так же настроил токены для своего приложения, и все прошло нормально.
Но что интересно, это комментарий от Галило Галило. По его / ее опыту, зависимости Firebase, используемые в сервис-воркере, должны были быть установлены с тем же номером версии, что и в package.json
. У меня не было этой проблемы, но об этом стоит помнить.
Реализация
За исключением следующего исключения, которое можно или нельзя улучшить, реализация, показанная в моем предыдущем руководстве, также остается в силе. Это то, что я реализовал в нашем приложении, и поэтому я сегодня успешно протестировал его на своем телефоне Android.
При этом я думаю, что может быть более простой способ, особенно если вы используете AngularFire, реализовать Web Push-уведомления в прогрессивных веб-приложениях. Я не проверял его, но, прежде чем следовать моему руководству, возможно, он заслуживает быстрого исследования, на случай, если вы сможете сэкономить немного времени 😉.
Устаревание
Ничего страшного, но, взглянув на код, я заметил, что await messaging.requestPermission();
был помечен как устаревший. Его можно обновить следующим образом:
if (Notification.permission !== 'denied') { await Notification.requestPermission(); }
В целом
В общем, моя улучшенная служба Angular, которая занимается регистрацией веб-push-уведомлений и запросом разрешений.
import {Injectable} from '@angular/core'; import {firebase} from '@firebase/app'; import '@firebase/messaging'; import {environment} from '../../../environments/environment'; @Injectable({ providedIn: 'root' }) export class FirebaseNotificationsPwaService { async init() { navigator.serviceWorker.ready.then((registration) => { if (!firebase.messaging.isSupported()) { return; } const messaging = firebase.messaging(); messaging.useServiceWorker(registration); messaging .usePublicVapidKey(environment.firebase.vapidKey); messaging.onMessage((payload) => { // If we want to display // a msg when the app is in foreground console.log(payload); }); // Handle token refresh messaging.onTokenRefresh(() => { messaging.getToken().then( (refreshedToken: string) => { console.log(refreshedToken); }).catch((err) => { console.error(err); }); }); }, (err) => { console.error(err); }); } async requestPermission() { if (!Notification) { return; } if (!firebase.messaging.isSupported()) { return; } try { const messaging = firebase.messaging(); if (Notification.permission !== 'denied') { await Notification.requestPermission(); } const token: string = await messaging.getToken(); // User token console.log(token); } catch (err) { console.error(err); } } }
Резюме
Надеюсь, однажды мы сможем отправлять Web Push-уведомления и на устройства iOS 🤞.
Оставайся дома, будь в безопасности!
Дэйвид