【问题标题】:Device UUID not unique when user uninstall and re-install用户卸载并重新安装时设备 UUID 不唯一
【发布时间】:2016-10-25 02:04:01
【问题描述】:

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

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

我使用这个生成 uuid

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

谢谢。

【问题讨论】:

  • 这是identifierForVendor 的预期行为。它不是终生唯一的设备标识符。您可以将自己的值存储在钥匙串中,但您还应该为用户提供删除过时设备的工具;他们可能会因升级或保修更换而更换手机,或者只是擦除设备,这将清除钥匙串
  • 谢谢@Paulw11。如果用户在两台设备上使用相同的 iCloud 帐户如何。两个设备在钥匙串中是否具有相同的设备 ID(唯一 ID)?
  • 您可以选择是否将钥匙串项添加到 iCloud 钥匙串或将其保留在设备本地
  • @Paulw11 我明白了。保持本地的选项可以在代码中设置,或者取决于用户是否同步钥匙串?
  • 它是在您创建钥匙串项时以编程方式设置的。默认情况下,它仅在设备本地

标签: ios swift


【解决方案1】:

您需要使用钥匙串:(为了能够记住 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 课程
【解决方案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 解决方案。谢谢
猜你喜欢
  • 2017-12-09
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2017-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多