0

我提到了多个代码片段,几乎在所有地方,请求权限以允许使用 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);
        }
    }

}

我在我的应用程序中实现了相同的功能,但我面临这个问题 -

用户第一次加载应用程序时,浏览器会请求许可,如果用户“允许”,promise 将被解析,订阅对象将存储在 db 中。

下次用户加载应用程序时,由于已经授予权限,promise 将被解析,订阅对象将再次存储在 db 中。所以db中会有重复的条目。


为避免数据库中的重复条目,我想了解这两种解决方案中哪一种更好(或者是否有其他更好的方法):

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 每次在页面加载时被调用,并处理在服务器端代码中插入重复的数据库条目。

4

1 回答 1

0

通知浏览器 API有一个字段,该permission字段同步指示接受“默认”、“授予”或“拒绝”的当前状态。您可以检查此状态,并且仅在其处于“默认”状态时才请求权限。

于 2020-04-28T12:36:16.003 回答