【问题标题】: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 中存储标识符
- 如果用户已经安装,首先检查来自keychain 的值
是否在此设备上安装该应用。
- 如果是第一次安装,则提供免费硬币并将用户 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!
}
【解决方案4】:
用户可以将值存储在设备的钥匙串中。您可以将该数据保存在钥匙串中直到他重置手机中的所有设置。我通常使用this 库来使用钥匙串存储数据。
但最好使用网络服务将状态保存在服务器中,因为即使您将数据存储在钥匙串中,用户也可以重置设备的所有设置并再次安装应用程序,从而再次给他 3 个硬币。如果没有后端支持,就不可能为此做出完美的解决方案
【解决方案5】:
一种解决方案是使用设备的钥匙串存储。但是如果用户登录到其他设备,那么这个问题仍然存在。您可以为此使用 iCloud 钥匙串存储或将必要的参数存储在服务器上。使用 iCloud 钥匙串非常简单可靠
【解决方案6】:
如果删除应用程序,任何本地数据库、SQLite、Core Data、文件归档、plist 都将无法生存。
在 iOS 上重新安装应用后,可以通过三种方式获取持久数据:
- 将数据保存在服务器上。但这种情况只有在用户始终登录帐户时才有效。
- 使用钥匙串存储数据。有很好的 Keychain 实现,例如
JNKeychain
- 使用 iCloud。在您的应用程序中实现 CloudKit 将使您能够保存数据
对应于稍后可以检索的 iCloud 用户
重新安装。