持久性数据应该存储在iOS中的哪个位置?

时间:2012-07-19 10:22:06

标签: iphone ios ipad persistence

问题:
iOS设备上的哪些地方可以存储小块信息(只有几个字节,在我的情况下只有1位),以便在应用程序从手机中删除并稍后重新安装后仍然可用?

背景
我正在开发一个免费进入appstore的应用程序。与应用程序一起提供免费的测试包。此测试包可在限定时间内访问我服务器上的有限数量的项目。如果用户想要,他/她可以购买更多物品的额外包裹,持续时间更长。

要使用此程序包,每个用户必须在我的服务器上创建一个帐户。每个帐户只需一个免费包即可轻松制作shure。但我没有看到让用户创建其他帐户的内容的方法。所以我想要更多:

我想,每个用户(每个活着的人)只能使用一个免费软件包,独立于他/她将创建的帐户数量。

我知道,限制用户(活人)的水平是不可能的。但是,在手机上重拍它是可以接受的,因为我相信,没有多少人同时使用更多的2或3部iPhone。如果一个人在3个不同的iPhone上使用我的应用程序只是为了能够使用3个不同帐户的3个免费软件包,那么这对我来说是可以接受的。

但要这样做,我需要将信息存储在手机的某个地方,与应用程序一起提供的免费软件包已经在使用中。但是,当用户卸载应用程序并稍后重新安装时,该信息仍必须可供应用程序使用。我不知道在从手机中删除应用程序后,将这些微小的1位信息存储在何处以保存。

你能帮忙吗?

4 个答案:

答案 0 :(得分:2)

解决此问题的最简单方法是在服务器上存储iPhone UniqueDeviceId。然后,当有人尝试从设备注册帐户时,您可以检查设备是否已创建帐户。

Apple从SDK中移除(折旧)了UDID,因此另一种方法是使用GitHub上提供的OpenUDID。这将为您提供识别设备的唯一ID:

OpenUDID - GitHub

答案 1 :(得分:1)

iOS中没有这样的地方。如果删除了应用程序,您可以使用KeyChain存储一些数据以保留。但是如果用户清除设备,这些设置将会进入。

目前还没有办法做到这一点,制作一个免费增值应用,不应该限制在时间上使用,而是在功能上更多。

答案 2 :(得分:1)

这就是我所做的HubertSchölnast:

  1. 我的应用需要登录,所以每个人都必须拥有有效的登录用户名和密码。

  2. 该应用程序使用的是UUID而不是UDID或任何替代方案,每当应用程序与服务器通信时,它都会将UUID和用户的身份发送到服务器。

  3. 在服务器端,我有数据库表存储用户的身份和他们的UUID。

  4. 在服务器端,在代码中,我强制执行逻辑以检查用户以及每个Web服务调用的UUID。如果他们违反了规则,我会根据规则在用户表或设备表中标记它们。

  5. 还有一个问题,如果他们继续卸载应用程序并重新安装它,并且每次都使用其他用户名注册,那么很难识别。但是,这取决于他们真正想要滥用您的系统的努力程度。

    在我的应用程序中,这不是问题,因为用户注册不对公众开放。

    希望这有帮助。

答案 3 :(得分:1)

我自己找到了答案:即使应用程序被删除,存储在钥匙串中的数据也会保留在那里,并且可以在重新安装后从同一个应用程序访问。这正是我所需要的 只有完全重新安装固件才能删除条目,但这也会删除每个其他应用程序的所有其他条目。人们不会经常这样做,我认为只是为我的应用程序访问额外的免费软件包真的太过分了。这对我来说是可以接受的。

Apple为钥匙串访问提供了一个示例应用程序。我没有详细阅读这个示例应用程序,但我发现它包含了我需要的所有内容:http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html


修改

将信息存储为通用密码是我的问题的最佳解决方案,但Apples example-app有一个错误。在这个bug中有一个错误的属性,用作存储通用密码的“唯一键”。有关详细信息以及如何使钥匙串项目真正独特,请查看以下问题:What makes a keychain item unique (in iOS)?