如何检测用户之前是否安装过此应用程序

时间:2015-05-24 09:29:47

标签: ios objective-c iphone

我正在尝试检查用户是否已经在他的iOS设备上安装了这个应用程序。

例如,我安装应用X,然后卸载它,再次安装它。

我希望应用X能够检测到设备之前已安装此应用,这是重新安装。

更新

感谢所有分享钥匙串,供应商ID等解决方案的朋友。我应该注意的主要主题(如评论中所述)是;是否有解决方案即使在系统恢复或系统恢复出厂设置后仍然有效?根据@ Andrea的回答使用收据可能有效,但我们想要在企业帐户中发布应用程序的案例呢?或者,如果用户使用越狱设备并使用IPA安装应用程序,该怎么办?有些时候由于安全问题,我们想要检测这个应用程序之前是否安装?那么我们如何才能发现它?

6 个答案:

答案 0 :(得分:1)

也许尝试检查应用收据,您可以推断出原始购买日期(即使应用程序是免费的,它附带收据),但这可能是difficult
如果你想这样做,你可以在钥匙串上添加一个标志。卸载后,Keychain值仍然存在,但在系统还原后则不会 当然,这只能在将来的版本中使用。

答案 1 :(得分:1)

正如OP在一条评论中提到的那样,Apple不允许访问设备UDID,因此我们需要一种不同的方法来唯一地识别用户。

为了获得唯一标识您可以使用的用户的标识符:

[[UIDevice currentDevice] identifierForVendor]

但请注意,根据Apple文档:

  

在iOS设备上安装应用程序(或来自同一供应商的其他应用程序)时,此属性中的值保持不变。当用户从设备中删除所有该供应商的应用程序并随后重新安装其中一个或多个应用程序时,该值会更改。使用Xcode安装测试版本或使用ad-hoc分发在设备上安装应用程序时,该值也会发生变化。因此,如果您的应用程序将此属性的值存储在任何位置,则应优雅地处理标识符更改的情况。

可能的解决方案是将标识符存储在NSUserDefaults中以及服务器中,并具有一个逻辑,在启动时检查标识符是否有变化。在这种情况下,您可以在本地和服务器中更新标识符,以便为您的分析提供连续性,例如。

例如,检查标识符的更改:

NSString *previousUUID = [[NSUserDefaults standardUserDefaults] stringForKey:DEVICE_UUID];
NSString *currentUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
BOOL UUIDChanged = ![previousUUID isEqualToString:currentUUID];
// Handle this situation in your backend to offer continuity in your analytics

我在App Store中有三个使用此应用程序的应用程序,并且Apple没有遇到任何问题。

答案 2 :(得分:0)

iOS用于为安装的每个应用程序保留一部分磁盘,当您卸载应用程序时,该空间将被删除,因此没有描述应用程序安装时间的“cookie”。 您可以通过两种方式实现目标:通过钥匙串,例如您使用特定密钥保存值,并检查每个安装该密钥或通过简单的后端调用向您发送任何您想要的日期。我认为第一种解决方案更好。

答案 3 :(得分:0)

我会定义一种唯一标识设备的方法。每当在设备上发布安装时,我都会向存储设备密钥的服务器发送请求。如果密钥尚未存在于数据库中,那么我会存储它,否则安装已经发布。

答案 4 :(得分:0)

您可以将某些内容保存到钥匙串,然后尝试阅读它。

答案 5 :(得分:-3)

您可以使用APNS。 Apple推送通知服务。

设备令牌永远不会改变任何设备重置。

因此,您可以使用推送通知。

推送通知(设备令牌)对于每个设备都是唯一的,并且始终是相同的。

当app在您的服务器数据库上安装保存设备令牌时,只要应用程序再次安装在同一设备上,您就可以从服务器数据库中检查设备令牌。