设备唯一标识在用户卸载并重新安装应用后不再唯一。

3
我有一个系统,每个用户只能为两个设备安装应用程序。问题出现在用户在同一设备上卸载并重新安装时。因此,它将生成新的UUID,并在应用程序检查Web服务时进行检查。
应用程序将发送UUID和登录ID以检查是否已在两个以上设备中安装了具有该登录ID的用户。我正在使用真实的iPhone和iPad设备,而不是使用模拟器。我不确定生产环境是否可以。目前,应用程序使用Apple TestFlight使用AppStore分发配置文件进行分发。
我使用以下方法生成UUID:
let uuid = UIDevice.currentDevice().identifierForVendor!.UUIDString

感谢。

1
这是identifierForVendor的预期行为。它不是终身唯一的设备标识符。您可以在钥匙串中存储自己的值,但是还应该提供一个删除过时设备的功能;用户可能会由于升级或保修更换手机,或者仅擦除设备,这将清除钥匙串。 - Paulw11
谢谢@Paulw11。如果用户在两个设备上使用相同的iCloud帐户,那么这两个设备的钥匙串中是否会有相同的设备ID(唯一ID)? - xmhafiz
您可以选择将钥匙串项目添加到iCloud钥匙串中,或将其保留在设备本地。 - Paulw11
@Paulw11 我明白了。保留本地选项可以在代码中设置,或者取决于用户是否同步钥匙串? - xmhafiz
1
当您创建钥匙串项目时,它会通过编程方式进行设置。默认情况下,它仅限于设备本身。 - Paulw11
@Paulw11 很好。让我试一下,然后再回复你。谢谢。 - xmhafiz
2个回答

10

你需要使用钥匙串:(要导入JNKeychain,您需要在pod文件中输入新字符串pod'JNKeychain')。这将确保如果您不更改包标识符,则始终具有唯一的设备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?
    }
}

这个可行。也感谢KeychainManager类。 - xmhafiz

2
这是预期行为。如果您想使用相同的UUID,您需要将其保存到keyChain中。我在我的应用程序中使用了类似的方法,使用KeyChainWrapper的样例代码
let deviceId = UIDevice.currentDevice().identifierForVendor?.UUIDString ?? ""
// Saving Id in keyChain
KeychainWrapper.defaultKeychainWrapper().setString(deviceId, forKey: "CurrentDeviceId")

然后每次想要使用它时,只需从keyChain获取Id。

let previousDeviceId = KeychainWrapper.defaultKeychainWrapper().stringForKey("CurrentDeviceId")

这个对我也有效,但我更喜欢@Paul的解决方案。谢谢。 - xmhafiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接