How can I get a devices unique ID in Swift?
I need an ID to use in the database and as the API-key for my web service in my social app. Something to keep track of this devices daily use and limit its queries to the database.
Thanks!
This question is related to
ios
swift
uuid
uniqueidentifier
You can use devicecheck (in 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" ...
}
}
Typical usage:
Typically, you use the DeviceCheck APIs to ensure that a new user has not already redeemed an offer under a different user name on the same device.
Server action needs:
See WWDC 2017 — Session 702 (24:06)
more from Santosh Botre article - Unique Identifier for the iOS Devices
Your associated server combines this token with an authentication key that you receive from Apple and uses the result to request access to the per-device bits.
For Swift 3.X Latest Working Code, Easily usage;
let deviceID = UIDevice.current.identifierForVendor!.uuidString
print(deviceID)
I've tried with
let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString
instead
let UUID = NSUUID().UUIDString
and it works.
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")!)
if (UIDevice.current.identifierForVendor?.uuidString) != nil
{
self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
}
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)
}
}
}
The value of identifierForVendor changes when the user deletes all of that vendor’s apps from the device, if you want to keep the unique ID even for the subsequent fresh installations, you can try to use the following function
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
}
}
Source: Stackoverflow.com