在服务器上管理 APNS 和 FCM 令牌
managing APNS and FCM tokens on server
我一直在努力弄清楚如何在我正在编写的设备注册和推送通知服务器上管理 APNS 令牌。
问题的症结在于在卸载和应用程序更新过程中唯一标识设备。甚至供应商的标识符也可以在安装或更新过程中发生变化。似乎 Apple 和 Google 并不真的希望你能够做到这一点。
似乎有一些解决方法,例如在 iOS 设备上使用钥匙串和在 Android 上使用内部存储,但据我了解,这些方法中至少有一种需要用户许可,这可以拒绝一些用户。我想尊重用户的隐私并与他们建立信任。
这是我到目前为止提出的逻辑:
- 存储将由
application Id
、platform
、user Id
和 device Id
唯一标识的推送令牌(应用程序在本地存储中存储的唯一值)- 我们将将此唯一标识符称为 APUD Id
- 我们将拥有本质上是更新插入端点的东西(尽管我通常讨厌更新插入或实际上任何通用端点 - 看起来这可能是一个很好的例外情况)它需要更新令牌或其他设备数据并确定是否存在匹配项
APUD Id
- 如果存在则更新该行,否则创建一个新行
- 当向特定用户的设备发送推送通知时,找到所有尚未被软删除的匹配条目(当涉及多个服务实例时,硬删除可能更容易避免并发错误,但这是 OT - 理想情况下为了支持和调试目的,我们至少会保留这些数据一段时间)。由于我们无法唯一标识设备,因此这些通知应使用适当的折叠 ID(应允许设备唯一标识通知)以防止用户收到重复的通知。
- 如果 Apple 或 Google 响应指示令牌具有 expired/unregistered,则软删除该条目。
问题:
- 第4步靠谱吗?有一个更好的方法吗?有什么方法可以通过 cron 作业主动管理过期的令牌吗?这会不会导致大量积累很少过期的代币?
- 通常有更好甚至规范的方法来解决这个问题吗?
逻辑看起来不错。它与我在一些回答中建议的方法相似(如果不相同的话)。
Is step 4 reliable? Is there a better way to do this? Is there some way to pro-actively manage expired tokens through a cron job? Will this just result in a massive build-up of tokens that rarely expire?
可靠到可以防止构建 令牌并防止不必要的推送请求的程度。
Is there generally a better or even canonical way to approach this?
除此之外,我还没有找到更好的 方法来处理 FCM 令牌。
根据您拥有(或可能很快拥有)的任何其他规格,请确保(尽可能:
- 每个用户的令牌映射是准确的(通过每个平台的
onTokenRefresh()
)
- 删除过期的令牌(或在需要时存档,例如调试)
我一直在努力弄清楚如何在我正在编写的设备注册和推送通知服务器上管理 APNS 令牌。
问题的症结在于在卸载和应用程序更新过程中唯一标识设备。甚至供应商的标识符也可以在安装或更新过程中发生变化。似乎 Apple 和 Google 并不真的希望你能够做到这一点。
似乎有一些解决方法,例如在 iOS 设备上使用钥匙串和在 Android 上使用内部存储,但据我了解,这些方法中至少有一种需要用户许可,这可以拒绝一些用户。我想尊重用户的隐私并与他们建立信任。
这是我到目前为止提出的逻辑:
- 存储将由
application Id
、platform
、user Id
和device Id
唯一标识的推送令牌(应用程序在本地存储中存储的唯一值)- 我们将将此唯一标识符称为APUD Id
- 我们将拥有本质上是更新插入端点的东西(尽管我通常讨厌更新插入或实际上任何通用端点 - 看起来这可能是一个很好的例外情况)它需要更新令牌或其他设备数据并确定是否存在匹配项
APUD Id
- 如果存在则更新该行,否则创建一个新行 - 当向特定用户的设备发送推送通知时,找到所有尚未被软删除的匹配条目(当涉及多个服务实例时,硬删除可能更容易避免并发错误,但这是 OT - 理想情况下为了支持和调试目的,我们至少会保留这些数据一段时间)。由于我们无法唯一标识设备,因此这些通知应使用适当的折叠 ID(应允许设备唯一标识通知)以防止用户收到重复的通知。
- 如果 Apple 或 Google 响应指示令牌具有 expired/unregistered,则软删除该条目。
问题:
- 第4步靠谱吗?有一个更好的方法吗?有什么方法可以通过 cron 作业主动管理过期的令牌吗?这会不会导致大量积累很少过期的代币?
- 通常有更好甚至规范的方法来解决这个问题吗?
逻辑看起来不错。它与我在一些回答中建议的方法相似(如果不相同的话)。
Is step 4 reliable? Is there a better way to do this? Is there some way to pro-actively manage expired tokens through a cron job? Will this just result in a massive build-up of tokens that rarely expire?
可靠到可以防止构建 令牌并防止不必要的推送请求的程度。
Is there generally a better or even canonical way to approach this?
除此之外,我还没有找到更好的 方法来处理 FCM 令牌。
根据您拥有(或可能很快拥有)的任何其他规格,请确保(尽可能:
- 每个用户的令牌映射是准确的(通过每个平台的
onTokenRefresh()
) - 删除过期的令牌(或在需要时存档,例如调试)