用户卸载并重新安装时,设备UUID不是唯一的

时间:2016-10-25 02:04:01

标签: ios swift

我有一个系统,每个用户只允许为两台设备安装应用程序。当用户在同一设备上卸载并重新安装时,会发生此问题。因此,当应用程序检查Web服务时,它将生成新的UUID。

应用程序将发送UUID和登录ID,以检查具有该登录ID的用户是否已安装在两个以上的设备中。我使用真正的iPhone和iPad设备,而不是使用模拟器。我不确定生产环境。目前,使用Apple TestFlight使用AppStore Distribution配置文件分发应用程序。

我使用此

生成uuid
let uuid = UIDevice.currentDevice().identifierForVendor!.UUIDString

感谢。

2 个答案:

答案 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")