我有一个系统,每个用户只允许为两台设备安装应用程序。当用户在同一设备上卸载并重新安装时,会发生此问题。因此,当应用程序检查Web服务时,它将生成新的UUID。
应用程序将发送UUID和登录ID,以检查具有该登录ID的用户是否已安装在两个以上的设备中。我使用真正的iPhone和iPad设备,而不是使用模拟器。我不确定生产环境。目前,使用Apple TestFlight使用AppStore Distribution配置文件分发应用程序。
我使用此
生成uuidlet uuid = UIDevice.currentDevice().identifierForVendor!.UUIDString
感谢。
答案 0 :(得分:8)
您需要使用钥匙串:(为了能够导入JNKeychain,您需要在您的pod文件pod 'JNKeychain'
中输入新字符串)。这将保证您,如果您不更改捆绑标识符,您将始终拥有uniq设备ID(即使在删除您的应用后也会保持不变)。我使用过,当用户在我们的应用程序中被永久禁用时,即使删除应用程序,即使使用不同的帐户,他也无法进入应用程序。
import UIKit
import JNKeychain
class KeychainManager: NSObject {
static let sharedInstance = KeychainManager()
func getDeviceIdentifierFromKeychain() -> String {
// try to get value from keychain
var deviceUDID = self.keychain_valueForKey("keychainDeviceUDID") as? String
if deviceUDID == nil {
deviceUDID = UIDevice.current.identifierForVendor!.uuidString
// save new value in keychain
self.keychain_setObject(deviceUDID! as AnyObject, forKey: "keychainDeviceUDID")
}
return deviceUDID!
}
// MARK: - Keychain
func keychain_setObject(_ object: AnyObject, forKey: String) {
let result = JNKeychain.saveValue(object, forKey: forKey)
if !result {
print("keychain saving: smth went wrong")
}
}
func keychain_deleteObjectForKey(_ key: String) -> Bool {
let result = JNKeychain.deleteValue(forKey: key)
return result
}
func keychain_valueForKey(_ key: String) -> AnyObject? {
let value = JNKeychain.loadValue(forKey: key)
return value as AnyObject?
}
}
答案 1 :(得分:2)
这是预期的事情。如果要使用相同的UUID,则需要将其保存到keyChain。我使用KeyChainWrapper
在我的应用中做了一些simmiler所以这里有一个样本块
let deviceId = UIDevice.currentDevice().identifierForVendor?.UUIDString ?? ""
// Saving Id in keyChain
KeychainWrapper.defaultKeychainWrapper().setString(deviceId, forKey: "CurrentDeviceId")
然后每当你想使用它时,只需从keyChain获取Id。
let previousDeviceId = KeychainWrapper.defaultKeychainWrapper().stringForKey("CurrentDeviceId")