如何知道应用程序数据是否被清除或应用程序已被卸载?

4

我正在开发一个应用程序,它基于登录-注销机制,并集成了REST API

为了进行REST API请求,需要TOKEN。应用程序将此TOKEN和其他用户详细信息保存到SharedPreferences中。

当用户登录时,应用程序会保存所有必需的数据,而在注销时,所有数据都会从SharedPreferences中删除,并且TOKEN条目也会从应用程序服务器中删除。

应用程序还向GCM服务器注册以向用户发送推送通知。为此,应用程序将设备注册ID发送到应用程序服务器。

但是,如果用户清除应用程序数据或卸载应用程序,则应用程序将打开登录屏幕并重新向应用程序服务器和GCM服务器注册,因此旧条目仍然存在于应用程序服务器中,并添加了新条目。

因此,如果服务器向应用程序发送推送通知,则设备将接收到两个推送通知。

有没有办法在程序上检测应用程序数据是否被清除或应用程序是否被卸载?

任何帮助将不胜感激。


在您的服务器上保存每个用户的唯一ID。 - showp1984
1
设备在GCM中生成的注册ID将对应于同一个应用程序,它很少会发生变化。 - Rajesh Jadav
有没有办法在程序中检测到应用数据是否被清除或应用是否已卸载?没有。 - Tim
1
如果用户重新安装应用并使用另一个用户名,则应将其视为新用户。否则,如果他使用与之前相同的登录详细信息,请仅在服务器上检查该用户是否已存在并更新详细信息。 - SuperFrog
4个回答

3

最终,我想出了以下解决方案。

我使用Instance ID API实现了GCM 3.0,通过ApplicationGCM服务器发送推送通知到应用程序,而不是旧的GoogleCloudMessaging.register(SENDER_ID);

因此,当应用程序服务器尝试向设备发送推送通知时,服务器会收到旧设备ID的"error":"NotRegistered"响应,因此服务器将删除无用的条目。

在GCM 2.0中,即使应用程序已安装,服务器有时也会收到"error":"NotRegistered"响应,但在GCM 3.0中,它可以完美地工作。


你如何知道你正在使用哪个版本? - Tim
GCM 3.0 引入了主题消息和 Instance ID API,而之前的 API GCM 2.0 包括 GoogleCloudMessaging.register(SENDER_ID)。 - Rajesh Jadav

1

在应用程序中保存公共数据,如登录ID、公共ID等,而不是安全数据,这样更好。让您的服务器也具有相同的公共ID。因此,如果清除或卸载应用程序数据,则应用程序中的登录ID、公共ID也会被擦除。因此,下次他安装应用程序或从头开始尝试登录时,如果他使用相同的登录ID,则将分配不同的公共ID。在与服务器进行身份验证时,服务器将尝试与已存在的登录ID匹配,但它会知道公共ID不同,因此会忽略旧的publicID条目并为您的loginID创建相应的新publicID。通过这种方式,您可以防止针对相同登录ID的两个服务器推送通知。


如果他使用相同的登录ID,那么怎么办?但是如果他没有使用呢? - Tim
很好,这很容易。你在服务器上为新的登录ID和新的公共ID创建了一个新条目。他只会收到与该登录ID相关的推送通知。就像你有一个购物应用程序,你有两个账户,并且在同一设备上使用它。同时你只能使用一个账户。因此,你会收到特定账户/登录ID的推送通知。 - user5350286
如何处理服务中的残留数据?即不再使用的账户数据。 - Tim
当应用程序被卸载或清除时,该服务上的数据也会被重置。 - user5350286
该应用程序允许不同类型的用户登录,例如(客户、供应商)。用户首次使用客户登录。此条目已添加到服务器。现在用户卸载应用程序并重新安装后,使用供应商登录。当针对两种类型的用户发送任何通知时,设备将为两个用户接收通知。 - Rajesh Jadav

0

您可以使用广播接收器来处理卸载和数据擦除:

ACTION_UNINSTALL_PACKAGE

以及

EXTRA_DATA_REMOVED

您可以让程序在服务器中删除注册信息,或者让服务器对长时间闲置的注册信息进行“超时”处理。


0

你可以使用谷歌的Firebase Analytics来跟踪这些应用程序事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接