2

swPush在我的角度项目中使用。在这种情况下,this.swPush.requestSubscription()通过单击按钮调用事件。

例如:

getdeviceToken将调用

getDeviceToken(): Promise<any> {
        console.log('getting device token')
        return new Promise(async (resolve, reject) => {
                if (this.swPush.isEnabled) {
                    console.log('before subscription')
                    let sub = await this.swPush.requestSubscription({
                        serverPublicKey: this.VAPID_PUBLIC_KEY
                    })
                    console.log('temp --------', sub)
                    if(sub) {
                        this.device_token = sub;
                        if(sub) {
                            console.log('if sub')
                            resolve(this.device_token);
                        }else{
                            console.log('else sub')
                            reject({ message: "Error getting device id"});
                        }
                    } else{
                        reject({ message: "Error getting device id"});
                    }
                } else{
                    console.log('sw is not enabled');
                    reject({ message: "Error getting device id"});
                }
    }

硬重新加载后,当我第一次单击按钮时,它卡在了
console.log('before subscription')

并且什么也不返回。它使我的应用程序无法使用,因为该函数没有返回任何内容,甚至没有返回错误。所以我无法前进。

但是,当我进行简单的重新加载并再次单击该按钮时,它会起作用并向this.swPush.requestSubscription()我返回一个承诺,因此我的应用程序正在向前发展。任何人都知道为什么它第一次不起作用?或任何改善这一点的建议。

4

1 回答 1

0

我得到了这个解决方案,IDK如何,但它每次都有效......

  1. 在页面中将推送通知权限设置为询问(默认)

  2. 请求用户的许可使用Notification.requestPermission().then( result => { getSubscriptionData(); });

  3. 避免使用 chrome,因为它会检查安全性,来自除 https:// 之外的任何服务器的数据都会被阻止。改用更新的 EDGE 或 firefox

如果您有任何其他解决方案,请注释掉......这是我的完整代码:

constructor(private _floatNotifications: FloatNotificationService,
    private readonly _swPush: SwPush,
    private _apiService: APIservice) { }

  ngOnInit(): void {
    this.getSubscription();
  }

  getSubscription() {
    console.log(Notification.permission);
    if(Notification.permission === 'default') {
      Notification.requestPermission().then(() => {
        this.requestSubscription();
      }).catch(() => {
        // show permission denied error
      });
    }
    else if(Notification.permission === 'denied') {
      // show permission is denied, please allow it error
    } else {
      this.requestSubscription();
    }
  }

  async requestSubscription() {
    try {
      const sub = await this._swPush.requestSubscription({ serverPublicKey: ServiceKeysEnum.PUSH_SUBSCRIPTION_PUBLIC_KEY });
      console.log("subscription object ", sub);
    } catch  (e) {
      this._floatNotifications.makeToast.next({header: "Task failed", text: "failed to get subscription object"+e, DurationsEnum: DurationsEnum.MEDIUM, type: "danger"});
    }
  }
于 2021-09-06T12:01:01.743 回答