首页 > 解决方案 > Firebase 消息:我可以在不调用浏览器提示的情况下检查用户是否已经拥有令牌?

问题描述

我正在构建一个 Angular WEB应用程序,它使用 Firebase 提供云推送通知。我使用 AngularFireMessaging 服务(来自 Angular Fire 库)。首先,当应用程序启动时,我检查用户是否已经授予权限和请求的令牌,这可以使用 getToken() 方法轻松完成。这是我正在做的一个非常简短的示例:

import { AngularFireMessaging } from '@angular/fire/messaging';

@Injectable()
export class PushNotificationsService {
    constructor(private afMessaging: AngularFireMessaging) {}

    detectPermissionStatus(): Observable<string> {
        return this.afMessaging.getToken().pipe(
            map(token => { /*.... some code here....*/ })
        );
    }
}

如果我已经授予权限并且令牌可用,那么 observable 会立即返回它,然后我会做任何我想做的事情。但是,如果我没有任何权限状态(例如,当我第一次访问该页面时),则会调用默认浏览器提示以允许/拒绝通知。这对我来说似乎很奇怪,因为我没有明确调用 requestPermission() 函数。似乎 getToken() 函数也以某种方式使浏览器调用提示。这是我并不真正想要的行为,因为它会阻止我的应用程序继续继续,因为我依赖于要返回的东西(无论它是现有令牌还是什么都没有)才能继续处理我需要的其余请求去做。

所以......简短的问题 - 有没有办法检查用户是否已经请求令牌而不调用提示?

编辑: 如果您想知道为什么我需要以这种方式执行这些操作 - 这是因为我想在发送登录请求之前检查用户是否有令牌以及是否存在令牌 - 我将令牌与登录一起发送要求。然后在后端我只是检查这个用户是否已经与这个令牌相关联(这可能发生在使用同一浏览器的多个用户共享一个令牌),如果是 - 他们对此订阅的最新决定是什么(他们是否选择通知与否)。我希望你已经得到了图片 - 如果出现提示窗口,应用程序将挂起并等待做出某些决定,然后我们继续登录。

编辑: 我发现的另一个解决方案是使用内置于 Notification api 的浏览器。使用 Notification.permission 我可以看到权限的状态(默认、拒绝或授予)。如果它返回状态“已授予”,我知道我有一个令牌,我可以继续从 firebase 消息传递调用 getToken()。否则我直接跳到登录页面,稍后当用户决定订阅通知时我会调用提示。

标签: angularpermissionsfirebase-cloud-messagingtokenangularfire

解决方案


我发现另一种可能有用的方法是将local-storage数据设置为真/假。由于 Firebase 令牌正在关注浏览器。

然后您可以运行该local-storage检查并调用firebase.messaging.getToken()函数。


推荐阅读