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

224

如何在Swift中获取设备的唯一标识符?

我需要一个ID用于数据库,并作为我的社交应用程序中Web服务的API密钥。这样可以跟踪该设备的每日使用情况并限制其对数据库的查询。

12个回答

472

你可以使用以下代码(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

2
是的,我想这是显而易见的事情,但我在答案中还是包含了它。 - Atomix
31
卸载应用程序后,此号码不再相同。是否有办法在应用程序卸载后仍能跟踪设备? - jmcastel
9
更好的问题是,如果在卸载后它被移除了,当ID不再被使用时,你如何在服务器上删除他们的账户? - Jason G
1
@jmcastel,你可以将它保存在钥匙串中,每次应用程序启动时,在请求新的内容之前先检查一下。 - Islam
3
很多东西在模拟器上无法正常工作。你有在真实设备上尝试过吗? - Atomix
显示剩余10条评论

22

您可以在 Swift 4 中使用 devicecheck 苹果文档

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来确保新用户没有在同一设备上使用不同用户名下的优惠。

服务器操作需要:

请参阅WWDC 2017-Session 702(24:06)

更多来自Santosh Botre文章- iOS设备的唯一标识符

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


2
如果我理解正确,令牌生成是使用DCDevice.generateToken()完成的,并且每次调用都会生成一个唯一的随机device_token。因此,device_token不是持久性的,而是暂时性的。我不明白的是服务器如何将暂时性令牌与设备关联起来。 - user1118764
@user1118764 "设置两个位——应用服务器将负责共享此令牌并设置位值。" 在此处阅读更多信息 https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d,以及官方文档中的此处 https://developer.apple.com/documentation/devicecheck/accessing_and_modifying_the_per_device_data 和 702 会话 https://developer.apple.com/videos/play/wwdc2017/702/。 - iluvatar_GR
1
FYI,24:06 是 WWDC 2017 Session 702 中讨论 DeviceCheck 的幻灯片。 - Garret Kaye
1
有没有一种方法可以在不让服务器进行额外的请求到苹果的情况下完成它呢? generateToken 生成的数据令牌不够用吗? - Yonathan Goriachnick

11

针对Swift 3.X最新的可用代码,易于使用;

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

6
每次卸载并重新安装应用程序时,都会更改此内容。 - iPeter
12
这只是@Atomix和JayprakasDubey答案的副本。 - Ashley Mills
您可以使用FCUUID pod(https://github.com/fabiocaccamo/FCUUID),它允许您获取一个uuid,即使应用程序被删除后也不会更改。 - Yonathan Goriachnick

9
您可以使用UIDevice类中的identifierForVendor公共属性。
let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
        print("UUID: \(UUIDValue)")

编辑 Swift 3:

UIDevice.current.identifierForVendor!.uuidString

编辑结束

属性层次结构的截图


这是一张属性层次结构的截图。

4
这只是@Atomix答案的复制。 - Ashley Mills
1
你可以使用FCUUID库(https://github.com/fabiocaccamo/FCUUID),它允许您获取一个uuid,在应用程序被删除后仍不会改变。 - Yonathan Goriachnick

5
在Swift 4.5中,您可以使用以下代码获取UUID。
print(UIDevice.current.identifierForVendor!.uuidString)

输出

enter image description here

此外,您可以从已连接的设备中获取多个属性。

 UIDevice.current.name             // e.g. "My iPhone"
 UIDevice.current.model            // e.g. @"iPhone", @"iPod touch"
 UIDevice.current.localizedModel   // localized version of model
 UIDevice.current.systemName       // e.g. @"iOS"
 UIDevice.current.systemVersion    // e.g. @"15.5"

3

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")!)

6
如果用户删除应用程序,那么NSUserDefaults也会随着应用程序卸载而被删除,因此没有任何作用。 - Rehan Ali

0

iOS 11及以上版本可以使用苹果的API:DeviceCheck


0
如果像我一样,你想要获取使用移动设备管理(MDM)系统管理的设备的唯一设备标识符,你可以使用Managed App Configuration
有一个特殊的UserDefaults部分,你可以使用它,你的MDM系统可以更改它,并且你可以在应用程序端读取:

UserDefaults.standard.object(forKey: "com.apple.configuration.managed")

对于设备ID,你可以决定将你的键命名为deviceID(但它可以是任何名称),并从上述的UserDefaults中读取它。然后在MDM端,你将把这个变量设置为设备的ID。
在大多数移动设备管理(MDM)系统中,有几个变量,其中包括设备序列号、设备ID、MEID、MAC地址等。在应用的托管配置部分,添加您的键deviceID并将其设置为由您的MDM系统提供的序列号变量。然后,MDM系统将使用该键和不同的值更新特殊的托管UserDefaults部分,具体取决于安装它的设备,从而允许您从应用程序中访问该值。

-1
在iOS上,我们经常混淆UDID和UUID字符串。实际上,它们是不同的。
根据大多数答案的看法,我们更多地使用UUID,而问题实际上是关于UDID的。
1. UUID - 不是唯一的,每次应用重新安装或恢复出厂设置时,标识符的值都会改变。 示例:UUID().uuidString
2. UDID - 是一个唯一的值。它特指您的设备,无法通过编程获得。

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

2
请注释您的代码并/或提供详细说明和解释,说明它如何解决所发布的问题。 - RyanNerd
建议的编辑队列已满。如果您可以浏览这些内容并在其中一个或两个上单击接受,那么这可能用于推送通知注册,对吧? - CDM social medias in bio

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