如何在Swift中获取唯一的设备ID?

时间:2014-09-19 02:30:50

标签: swift ios8 uuid uniqueidentifier

如何在Swift中获取设备唯一ID?

我需要在数据库中使用ID,并在社交应用中使用我的Web服务的API密钥。跟踪日常使用的设备并将其查询限制在数据库中的东西。

谢谢!

9 个答案:

答案 0 :(得分:325)

你可以使用它(Swift 3):

UIDevice.current.identifierForVendor!.uuidString

对于旧版本:

UIDevice.currentDevice().identifierForVendor

或者如果你想要一个字符串:

UIDevice.currentDevice().identifierForVendor!.UUIDString


在用户卸载应用程序后,不再能够唯一地识别设备。文档说:

  

在iOS设备上安装应用程序(或来自同一供应商的其他应用程序)时,此属性中的值保持不变。当用户从设备中删除所有供应商的应用程序并随后重新安装其中一个或多个应用程序时,该值会更改。


您可能还想阅读Mattt Thompson的这篇文章了解更多详情:
http://nshipster.com/uuid-udid-unique-identifier/

更新Swift 4.1 ,您需要使用:

UIDevice.current.identifierForVendor?.uuidString

答案 1 :(得分:9)

对于 Swift 3.X 最新工作代码,易于使用;

   let deviceID = UIDevice.current.identifierForVendor!.uuidString
   print(deviceID)

答案 2 :(得分:8)

您可以使用UIDevice类中的identifierForVendor公共属性

let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
        print("UUID: \(UUIDValue)")

修改 斯威夫特3:

UIDevice.current.identifierForVendor!.uuidString

结束编辑

Screenshot for property hierarchy

答案 3 :(得分:6)

您可以使用设备检查(在Swift 4中) Apple documentation

func sendEphemeralToken() {
        //check if DCDevice is available (iOS 11)

        //get the **ephemeral** token
        DCDevice.current.generateToken {
        (data, error) in
        guard let data = data else {
            return
        }

        //send **ephemeral** token to server to 
        let token = data.base64EncodedString()
        //Alamofire.request("https://myServer/deviceToken" ...
    }
}

典型用法:

  

通常,您使用DeviceCheck API确保新用户尚未在同一设备上使用其他用户名兑换优惠。

服务器操作需要:

See WWDC 2017 — Session 702

more from Santosh Botre article - Unique Identifier for the iOS Devices

  

您的关联服务器将此令牌与您从Apple收到的身份验证密钥组合在一起,并使用结果请求访问每个设备的位。

答案 4 :(得分:2)

Swift 2.2

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey("ApplicationIdentifier") == nil {
        let UUID = NSUUID().UUIDString
        userDefaults.setObject(UUID, forKey: "ApplicationIdentifier")
        userDefaults.synchronize()
    }
    return true
}

//Retrieve
print(NSUserDefaults.standardUserDefaults().valueForKey("ApplicationIdentifier")!)

答案 5 :(得分:0)

class func uuid(completionHandler: @escaping (String) -> ()) {
    if let uuid = UIDevice.current.identifierForVendor?.uuidString {
        completionHandler(uuid)
    }
    else {
        // If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
        // https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor?language=objc
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            uuid(completionHandler: completionHandler)
        }
    }
}

答案 6 :(得分:0)

当用户从设备删除该供应商的所有应用程序时, identifierForVendor 的值会更改,如果您甚至在以后的全新安装中也要保留唯一ID,则可以尝试使用以下命令功能

func vendorIdentifierForDevice()->String {
    //Get common part of Applicatoin Bundle ID, Note : getCommonPartOfApplicationBundleID is to be defined.
    let commonAppBundleID = getCommonPartOfApplicationBundleID()
    //Read from KeyChain using bunndle ID, Note : readFromKeyChain is to be defined.
    if let vendorID = readFromKeyChain(commonAppBundleID) {
        return vendorID
    } else {
        var vendorID = NSUUID().uuidString
        //Save to KeyChain using bunndle ID, Note : saveToKeyChain is to be defined.
        saveToKeyChain(commonAppBundleID, vendorID)
        return vendorID
    }
}

答案 7 :(得分:0)

if (UIDevice.current.identifierForVendor?.uuidString) != nil
        {
            self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
        }

答案 8 :(得分:-15)

我试过

let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString

代替

let UUID = NSUUID().UUIDString

它有效。