我对 Flutter 中的 FCM 和推送通知有点陌生,所以我目前正在考虑以下设置,但我遇到了 3 个最后问题。
当前设置:
users
的数据库表,让我们保持简单,假设由 ID
、name
组成。users.ID
作为 FK 映射到第二个表的 uid
字段,另外还有字段 ID
(代理 PK)、device_token
和 is_active
(布尔)。对第二个数据库表的思考:
据我了解,FCM 使用的设备令牌是特定于每个应用程序安装+设备的。意味着卸载应用程序并重新安装它,然后调用
FirebaseMessaging.instance.getToken()
将生成并从 FCM
获取新的设备令牌。正确吗?
因此,我的想法是我必须:
A) 能够同时跟踪每个用户的多个设备令牌。
B) 能够知道哪些设备令牌是活动设备,以避免向不再使用/甚至不再存在的设备发送推送通知。
完成上述第二个表,A)就完成了。但我不知道如何优化B);当设备令牌变为非活动状态时,我应该如何注意到?我首先想到的是在添加新用户时停用用户的所有设备令牌,方法是将相关用户记录的第二个表的
is_active
字段设置为 0
。但很可能用户在智能手机和平板电脑上都使用应用程序,并授予在两者上接收推送通知的权限。对应两个活跃设备。
然后我开始阅读有关权限的内容,令我困惑的是它们与设备令牌无关?据我了解,设备令牌是通过
FirebaseMessaging.instance.getToken()
获取的(如果请求的应用程序+设备不存在则生成),通过 FirebaseMessaging.instance.requestPermission()
授予权限。因此,我们实际上在调用 FirebaseMessaging.instance.getToken()
时总是会获得设备令牌,并且我们始终可以向获得的设备令牌发送推送通知。但是,如果之前已通过 FirebaseMessaging.instance.requestPermission()
触发的弹出窗口授予权限,它只会显示在相关设备上。这是正确的吗?
因此,我的问题是:
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
badge: true,
sound: true,
provisional: false,
);
并检查是否
settings.authorizationStatus == AuthorizationStatus.authorized
,这意味着它已被授予,在这种情况下,上面的requestPermission
调用不会触发弹出窗口,对吗?
用于检查不再活动的设备令牌的“垃圾收集”的标准做法是什么?我看到的唯一方法是仅将设备令牌存储在您自己的服务器数据库中,供授予权限的移动应用程序用户使用?当他们撤销权限时,您将自己服务器数据库中相关设备令牌的
is_active
字段设置为 0
吗?或者我在这里遗漏了什么?
我读到 Firebase 自动轮换设备令牌,有点像使用访问密钥。我完全不明白你为什么要这样做,这让我很困惑,如果设备令牌是在 firebase 中生成/旋转,但存储在我自己的服务器上,我应该如何跟踪设备令牌旋转?在我的服务器上配置某种侦听器来侦听 Firebase 的设备令牌轮换,并每次都通过全表扫描来扫描我的整个数据库以查找相关设备令牌,这样的事情对我来说听起来像是一场噩梦?这种轮换是否可以以某种方式关闭,因为我认为它没有任何好处,因为身份验证无论如何都是通过不同的身份验证密钥、令牌和证书进行的?