2

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

背景:
我正在开发一个可以免费进入应用商店的应用。与应用程序一起提供了一个免费的测试包。这个测试包允许在有限的时间内访问我服务器上有限数量的项目。如果用户愿意,他/她可以购买更多物品和更长持续时间的附加包。

要使用此软件包,每个用户都必须在我的服务器上创建一个帐户。很容易确保每个帐户只能使用一个免费包。但是我看不到阻止用户创建数百个额外帐户的方法。所以我想要更多:

我希望每个用户(每个活着的人)只能使用一个免费包,与他/她将创建的帐户数量无关。

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

但要做到这一点,我需要将信息存储在手机的某个位置,即与应用程序一起提供的免费包已经在使用中。但是当用户卸载应用程序并稍后重新安装时,该信息必须仍然可供应用程序使用。而且我不知道在从手机中删除应用程序后,将这个微小的 1 位信息存储在哪里。

你能帮我吗?

4

4 回答 4

2

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

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

OpenUDID - GitHub

于 2012-07-19T10:31:52.247 回答
1

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

只是不确定如何做到这一点,制作一个免费增值应用程序不应该限制使用时间,而是更多的功能。

于 2012-07-19T10:26:47.210 回答
1

这就是我所做的 Hubert Schölnast:

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

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

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

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

还有一个问题,如果他们一直卸载应用程序重新安装,每次都用另一个用户名注册,那么很难识别。但是,这取决于他们真正想付出多少努力来滥用您的系统。

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

希望这可以帮助。

于 2012-07-19T15:00:43.000 回答
1

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

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


编辑:

将信息存储为通用密码是解决我的问题的最佳方法,但 Apple 的示例应用程序有一个错误。在这个错误中,错误的属性被用作“唯一键”来存储通用密码。有关更多详细信息以及如何使钥匙串项目真正独一无二,请查看以下问题:是什么让钥匙串项目独一无二(在 iOS 中)?

于 2012-07-19T17:30:22.633 回答