Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 持久性数据应该存储在iOS中的什么位置?_Iphone_Ios_Ipad_Persistence - Fatal编程技术网

Iphone 持久性数据应该存储在iOS中的什么位置?

Iphone 持久性数据应该存储在iOS中的什么位置?,iphone,ios,ipad,persistence,Iphone,Ios,Ipad,Persistence,问题: iOS设备上的哪些地方可以存储少量信息(只有几个字节,在我的情况下只有1位),以便在应用程序从手机上删除并稍后重新安装后,这些信息仍然可用 背景: 我正在开发一个将免费进入appstore的应用程序。该应用程序附带一个免费测试包。此测试包允许在有限的时间内访问我的服务器上数量有限的项目。如果用户需要,他/她可以为更多的项目和更长的时间购买额外的软件包 要使用此软件包,每个用户必须在我的服务器上创建一个帐户。舒尔很容易做到每个客户只能使用一个免费套餐。但我看不出有什么办法可以阻止用户创建数

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

背景:
我正在开发一个将免费进入appstore的应用程序。该应用程序附带一个免费测试包。此测试包允许在有限的时间内访问我的服务器上数量有限的项目。如果用户需要,他/她可以为更多的项目和更长的时间购买额外的软件包

要使用此软件包,每个用户必须在我的服务器上创建一个帐户。舒尔很容易做到每个客户只能使用一个免费套餐。但我看不出有什么办法可以阻止用户创建数百个额外帐户。所以我想要更多:

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

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

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


你能帮忙吗?

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


要做到这一点,目前还没有确定的方法,制作一个免费的应用程序不应该限制在时间上使用,而应该限制在功能上使用。

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

苹果从SDK中删除了UDID(折旧),因此另一种选择是使用GitHub上提供的OpenUDID。这将为您提供唯一标识设备的id:


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

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

  • 应用程序正在使用UUID而不是UDID或任何替代方案,每次应用程序与服务器对话时,它都会将UUID和用户身份发送到服务器

  • 在服务器端,我让数据库表存储用户的身份和UUID

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

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

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


    希望这能有所帮助。

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

    苹果提供了一个钥匙链访问的示例应用程序。我没有详细阅读这个示例应用程序,但我是舒尔,它包含了我需要的一切:


    编辑:


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

    您不应该这样做,因为您的身份不是用户而是设备。因此,如果我出售我的iPhone,新主人将无法使用你的应用程序“演示”。但如果你将一个帐户链接到UDID(或OpenUDID),新所有者可能会看到我的数据,这可能会更糟。我知道IOS不推荐使用UDID,但我不知道有类似OpenUDID的东西。这听起来是个好主意,我来看看。@rckoenes:好的,反对者。但我认为,有人将我的应用安装在二手iPhone上的几率非常低,因为我的应用以前在二手iPhone上使用过。但我会想一想,苹果提供了一个API来生成与UDID不同的特定于应用程序的设备标识符(每个设备都是唯一的,但不同的应用程序有不同的访问权限)。如果您不打算与其他开发人员(例如,广告网络)共享此标识符它对你来说应该和UDID一样好。@RanReloated:如果从手机上删除应用程序,然后在以后安装同一应用程序的更新版本,这个API会生成相同的设备标识符吗?我认为苹果不会批准商店中应用程序的“限时功能”。无论您提供什么,它都应该是无时间限制的。@RanReload:应用程序的功能不受时间限制。免费套餐的有效期是有限的。此外,付费包裹将有一个到期日期。另请参阅我对rockoenes答案的评论。该应用程序允许用户存储数据