【问题标题】:Limit iOS App even after the user re-installs it即使在用户重新安装后限制 iOS 应用程序
【发布时间】:2017-07-07 09:28:28
【问题描述】:

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

有没有简单的方法来防止这种情况?删除后如何知道用户是否在应用内完成了硬币?

【问题讨论】:

    标签: ios swift in-app-purchase


    【解决方案1】:

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

    方法一:在 KeyChain 中存储标识符

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

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

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

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

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

    而不是将详细信息存储在设备钥匙串上。您必须将其保存在您的服务器上。应用程序首次启动您必须与您的服务器核对以提供详细信息。

    即使用户重置他们的设备,这种方法也始终有效

    【讨论】:

      【解决方案2】:

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

      我正在使用Keychain library 轻松访问应用钥匙串。

      您可以使用以下方法获取和检查唯一设备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!
          }
      

      【讨论】:

        【解决方案3】:

        有几种实现方式:

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

        • 在您的服务器上存储用户个人资料和硬币数量。您还可以验证每个应用内购买并验证任何代币消耗操作,以防止 IAP 黑客工具、对用户配置文件同步的 Main-in-the-Middle 攻击等。

        【讨论】:

          【解决方案4】:

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

          最好使用网络服务将状态保存在服务器中,因为即使您将数据存储在钥匙串中,用户也可以重置设备的所有设置并再次安装应用程序,从而再次给他 3 个硬币。如果没有后端支持,就不可能为此做出完美的解决方案

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              如果删除应用程序,任何本地数据库、SQLite、Core Data、文件归档、plist 都将无法生存。 在 iOS 上重新安装应用后,可以通过三种方式获取持久数据:

              1. 将数据保存在服务器上。但这种情况只有在用户始终登录帐户时才有效。
              2. 使用钥匙串存储数据。有很好的 Keychain 实现,例如 JNKeychain
              3. 使用 iCloud。在您的应用程序中实现 CloudKit 将使您能够保存数据 对应于稍后可以检索的 iCloud 用户 重新安装。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-04-07
                • 1970-01-01
                • 1970-01-01
                • 2014-11-22
                • 2017-07-07
                • 2018-04-29
                • 1970-01-01
                • 2014-05-01
                相关资源
                最近更新 更多