【问题标题】:Android Gcm Unregister Users Subscribed To A Topic When App Uninstalled卸载应用时Android Gcm注销订阅主题的用户
【发布时间】:2015-09-06 02:21:12
【问题描述】:

场景:我有一个 3rd 方应用服务器、一个 gcm http 连接服务器和一个用于推送通知的 android 应用设置。当用户卸载应用程序时,我可以通过向他们的(不再有效的)注册 ID 发送推送通知并处理从 gcm 连接服务器返回的 "NotRegistered" 错误来从我的第 3 方服务器中删除它们。

但是,当您向订阅“主题”的用户发送推送通知时,这种类似的方法似乎不起作用,因为这里 gcm 连接服务器仅返回带有 "message_id" 的 json 对象。

我的 3rd-party 服务器数据库表中值得注意的列如下:

| gcmRegistrationID (string) | subscribedToNotificationTopic (boolean) |

有谁知道如何识别之前在subscribedToNotificationTopic 列中设置了true,然后卸载该应用的用户?

我对如何解决这个问题有一个想法,但它似乎有些混乱。

  1. 每隔一段时间,而不是只向某个主题发送推送通知,例如

    {
        "to" : "/topics/global",
        ...
    }
    

    向订阅该主题的用户的注册 ID 发送推送通知,例如

    {
        "registration_ids" : {list of registration ids},
        ...
    }
    

    这样我就可以检索和处理任何"NotRegistered" 错误。

然而,这个问题是多播消息有 1000 个用户的限制,所以我必须为每千个用户发送一条消息。

这似乎是一种不好的做法(尤其是在涉及多个主题的情况下),但也许这是唯一的方法?

(额外标签:主题消息传递、发布订阅、注销、谷歌云消息传递)

【问题讨论】:

    标签: android push-notification google-cloud-messaging uninstallation publish-subscribe


    【解决方案1】:

    首先,我不确定假设“未注册”错误只能是用户卸载您的应用程序的结果是否正确。如果设备收到一条消息但该消息无法传递,则该设备似乎可以取消注册。如果用户停止应用程序(这与卸载应用程序不同,或者即使应用程序被杀死并由于省电模式而保持停止状态,也会发生这种情况。

    https://developers.google.com/cloud-messaging/ccs#response

    如果未注册,则应从 您的服务器数据库,因为该应用程序已从 设备,或客户端应用未配置为接收消息。

    您可以做的是从设备端,定期注册设备,并确保您返回的令牌与您存储的令牌相同,如果没有使用新令牌更新您的服务器。

    至于检测用户是否通过对主题消息的响应卸载了您的应用程序,我同意您的观点,这似乎不是直接可能的。作为您提出的解决方案的替代方案,您可能会不时在主题消息中包含一个标志,如果设备在经过一定次数的尝试或一段时间的您可能会得出结论,用户不再在听。

    另一个问题是为什么你真的需要知道。向谷歌发送一些额外的 regid 有什么害处吗?如果用户退出您的网络服务,您可以将其从列表中删除,但如果他们只是从该设备上卸载您的应用程序,您真的需要采取行动吗? - 只是一些需要考虑的事情。希望这会有所帮助。

    【讨论】:

    • nPn,非常感谢您的回答。我确实考虑过自定义民意调查,但我希望会有别的东西。至于为什么我需要知道,这真的归结为规格和效率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多