Firebase 消息:我可以在不调用浏览器提示的情况下检查用户是不是已经拥有令牌?

Posted

技术标签:

【中文标题】Firebase 消息:我可以在不调用浏览器提示的情况下检查用户是不是已经拥有令牌?【英文标题】:Firebase Messaging: Can I check if the user already has a token without invoking the browser prompt?Firebase 消息:我可以在不调用浏览器提示的情况下检查用户是否已经拥有令牌? 【发布时间】:2020-04-11 09:29:35 【问题描述】:

我正在构建一个 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()。否则我直接跳到登录页面,稍后当用户决定订阅通知时我会调用提示。

【问题讨论】:

调查同一问题。问题是 getToken.subscribe 总是会弹出浏览器。没有类似 checkToken 的功能。所以确实原生 Notification.permission 是一个很好的解决方案。 我认为它在 5.x 中运行良好,但在 6.x 中损坏。 我也在这里创建了一个问题github.com/angular/angularfire/issues/2328 【参考方案1】:

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

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

【讨论】:

正如我在原帖中提到的 - 使用本地存储是最后的手段,我更喜欢不同的解决方案。无论如何,使用Notification.permission 的解决方案对我来说效果很好。由于我不再从事这个项目,所以我不知道发生了什么以及这是否已在 firebase 库中修复。

以上是关于Firebase 消息:我可以在不调用浏览器提示的情况下检查用户是不是已经拥有令牌?的主要内容,如果未能解决你的问题,请参考以下文章

在不调用 addValueEventListener 的情况下检索 firebase 数据库中的数据 [重复]

如何在不使用 Firebase 控制台的情况下向 iOS 设备发送 Firebase 云消息通知?

如何在不请求通知权限的情况下获取 Firebase 云消息传递的注册令牌?

Firebase 云消息在超出窗口焦点时不显示通知

IOS Web 浏览器上的 Firebase 消息传递

如何在不迁移到 Firebase 的情况下获取 google-services.json