Я сослался на несколько фрагментов кода, и почти везде код для запроса разрешения на использование push-уведомлений с использованием angular похож на этот:
export class AppComponent {
constructor(swPush: SwPush) {
if (swPush.isEnabled) {
swPush.requestSubscription({
serverPublicKey: VAPID_PUBLIC
}).then(subscription => {
// save subscription object in db
}).catch(console.error);
}
}
}
Я реализовал то же самое в своем приложении, ноЯ сталкиваюсь с этой проблемой -
Когда пользователь впервые загружает приложение, браузер запрашивает разрешение, а если пользователь «Разрешает», обещание будет разрешено, а объект подписки будет сохранен в дБ.
В следующий раз, когда пользователь загружает приложение, поскольку разрешение уже предоставлено, обещание будет выполнено, и объект подписки снова будет сохранен в базе данных. Таким образом, в БД будут повторяться записи.
Чтобы избежать дублирования записей в БД, я хотел бы понять, какое из этих двух решений лучше (или если есть какой-либо другой лучший подход):
1. Вызовите swPush.requestSubscription, если нет активной подписки
export class AppComponent {
constructor(swPush: SwPush) {
if (swPush.isEnabled) {
swPush.subscription.pipe(take(1)).subscribe(subscription => {
if(subscription == null) {
swPush.requestSubscription({
serverPublicKey: VAPID_PUBLIC
}).then(subscription => {
// save subscription object in db
}).catch(console.error);
}
}
}
}
}
2. Пусть swPush.requestSubscription вызывается каждый раз при загрузке страницы иобрабатывать вставку дублированных записей БД в коде на стороне сервера.