即使用户重新安装,也要限制iOS应用程序

我创build了一个应用程序,在第一次启动时给用户3个硬币。
一旦用户完成了3个硬币,他应该通过应用内购买来购买无限的硬币。
问题是,如果用户不想购买无限的硬币,他可以删除应用程序,再次安装应用程序,他将再次有3个硬币。
而且他可以永远做到这一点,而无需购买应用内购买。

有没有简单的方法来防止这种情况? 我怎么知道用户在删除应用程序后是否完成了应用程序中的硬币?

你可以用两种不同的方式处理这个问题。

方法1:将标识存储在KeyChain中

  1. 如果用户已经在该设备上安装了应用程序,首先检查钥匙串的值。
  2. 如果是第一次安装,则提供免费的硬币,并将用户ID /标志存储在钥匙串中以确定未来的安装。

如果用户重置他们的设备,您将丢失这个钥匙串数据。

重置设备后,您将再次提供硬币,因为您的标志/标识符将不在钥匙链中。

如果你想避免这种情况,那么你必须采取第二种方法。

方法2:在服务器上存储标识符

而不是在设备钥匙串上存储细节。 您必须将其保存在您的服务器上。 应用程序第一次启动,你必须检查你的服务器提供的细节。

即使用户重置其设备,此方法也始终有效

您可以从设备钥匙串中获取唯一的设备ID,并保存到服务器。在App第一次启动之后,您必须检查此唯一设备ID是否已经可用于您的服务器。

我正在使用钥匙串库来轻松访问应用程序钥匙串。

您可以使用下面的方法获取并检查唯一的设备ID

// MARK: - Get UUID from keychain because delete app and reintall changes the UUID. class var getUniqueDeviceIdentifierAsString : String { let appname = Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String var strApplicationUUID: String? = KeychainWrapper.standard.string(forKey: appname) if strApplicationUUID == nil { strApplicationUUID = UIDevice.current.identifierForVendor?.uuidString _ = KeychainWrapper.standard.set(strApplicationUUID!, forKey: appname) } return strApplicationUUID! } 

有几种方法来实现它:

  • 使用钥匙串来存储硬币数量。 任何其他本地存储都不太安全,不会“存活”应用程序删除。 我正在使用KeychainAccess库来轻松访问应用程序钥匙串。

  • 用硬币存储用户configuration文件数在您的服务器上。 您也可以validation每个应用程序内购买和validation任何硬币消费操作,以防止IAP Hack工具,用户configuration文件同步中的主要中间人攻击等。

用户可以将该值存储在设备的钥匙串中。 您可以将数据保存在钥匙串中, 直到他重置手机中的所有设置 。 我通常使用这个库来存储数据使用钥匙串。

但是最好是使用web服务来保持服务器的状态,因为即使你将数据存储在钥匙串中,用户也可以重置设备的所有设置并重新安装应用程序,从而再次给他3个硬币。 没有后端支持,不可能为此做一个完美的解决scheme

一个解决scheme是使用设备的钥匙串存储。 但是,如果用户login到其他设备,那么这个问题将仍然存在。 您可以使用iCloud keychain存储或者在服务器上存储必要的参数。 使用iCloud keychain非常简单可靠

任何本地数据库,SQLite,核心数据,文件存档,plist将无法生存,如果删除应用程序。 在iOS上重新安装应用后,有三种方法可以获得持久数据:

  1. 将数据保存在服务器上。 但是,这种情况下,只有用户始终login帐户才能正常工作。
  2. 使用钥匙串来存储数据。 有很好的钥匙串实现像JNKeychain
  3. 使用iCloud。 在您的应用程序中实施CloudKit将使您能够保存与重新安装后可检索的iCloud用户相对应的数据。