如何在iOS设备上获取UDID?

38
我想知道是否有可能找到用户iPhone的UDID。有人能解决一下吗?

2
这并不是一个真正的答案,但它与你的问题相关。苹果在iOS 5中已经停用了UDID访问 http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/ - Kye
1
@Kye:那么如何执行AdHoc和Push通知呢?我相信苹果一定有解决办法! - Karthikeyan
1
@Karthikeyan - 推送通知不使用 UDID。 - radesix
10个回答

67

18
请注意,这已在iOS 5中被弃用。 - g_fred
另一个好的提示是,如果您仍然想要类似于UDID的东西,但上面没有提到,请尝试检索设备的唯一MAC地址。 - Albert Renshaw
@AlbertRenshaw:你能给我展示一下在iOS 7上获取Mac地址的解决方案吗?我只知道如何在iOS 6上获取Mac地址。谢谢。 - heaven

11

正如一些人所说,在iOS5中,此方法已被弃用:

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

苹果现在有三个API可以获取设备的 UUID(通用唯一识别码):

替代方案1 (NSUUID类):

NSString *udid = [[NSUUID UUID] UUIDString];

备选方案2(UIDevice类):

NSString *udid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

替代方法三(ASIdentifierManager类,需要AdSupport框架):

NSUUID *UUID = [[ASIdentifierManager sharedManager] advertisingIdentifier];
NSString *udid = [UUID UUIDString];
但它们都是字母数字组合,而典型的设备唯一标识符只包含数字。因此这3个API都无用了,而旧的 [[UIDevice currentDevice] uniqueIdentifier] 在iOS6中仍然可用,但会持续多久呢?
如果“已弃用”警告令你不安,只需添加:
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

希望能对你有所帮助!


3
不,UDID 是由字母和数字组成的。 - Aniruddh
第二个替代方法很有用。 - Gajendra K Chauhan
同意Gajendra K Chauhan的观点,替代方案1每次被调用时都会返回不同的值。 - Javier Calatrava Llavería

6
在iOS5及以上版本中,使用以下方法查找UDID。
NSString *uuidString = nil;
CFUUIDRef uuid = CFUUIDCreate(NULL);
if (uuid) {
    uuidString = (__bridge NSString *)CFUUIDCreateString(NULL, uuid);
    CFRelease(uuid);
}
NSLog(@"UDID: [%@]", uuidString);

1
它对我非常有帮助,非常容易使用,适用于iOS5或iOS6。 - Jaspreet Singh
8
请注意,这是一个生成的ID,因此对CFUUIDCreate的后续调用将创建不同的ID。 典型模式是:尝试从NSUserDefaults中加载ID,如果为nil,则使用上面的代码生成并将其存储在NSUserDefaults中。 - Giacomo
8
值得重复的是:这不是设备的 UDID,而是生成的 UUID,并且每次调用都会生成一个新的。如果您需要一个唯一标识符,这种方法可以使用。但如果您需要设备的 UDID,那么这种方法是无用的。 - Abizern

3
值得一提的是,identifierForVendor对于一个设备来说并不是唯一的,它最终会发生改变。
苹果公司关于identifierForVendor的说明如下:
该属性的值对于来自同一供应商、在同一设备上运行的应用程序相同。对于来自不同供应商的应用程序以及来自不同设备的应用程序,返回不同的值。如果该值为nil,则等待并稍后再次获取该值。例如,在设备重新启动但用户未解锁设备之前会出现这种情况。当应用程序(或来自同一供应商的另一个应用程序)安装在iOS设备上时,此属性中的值保持不变。当用户从设备中删除所有该供应商的应用程序并随后重新安装其中一个或多个应用程序时,该值将更改。当使用Xcode安装测试构建或使用特定分发方式在设备上安装应用程序时,该值也可能更改。因此,如果您的应用程序在任何地方存储了该属性的值,则应优雅地处理标识符更改的情况。
但更糟的是,据AVG博客报道,苹果似乎正在移除使用MAC地址作为唯一标识符的最后手段。
那么现在该怎么办,如果我们想要唯一地识别设备 - 例如用于许可证、设置或其他目的?

2
在iOS5及以上版本中,使用以下代码生成唯一标识符(UUID):
NSString *uuidString = nil; CFUUIDRef uuid = CFUUIDCreate(NULL); ... 请注意,这段代码是用于生成唯一标识符,而不是获取设备的唯一标识符。

2
我无法发表评论,但我想警告其他人。 作为对DZenBot的回答,所有方法结果并不相同:

备选方案1(NSUUID类):

NSString *udid = [[NSUUID UUID] UUIDString];

替代方案2(UIDevice类)(适用于iOS 6.0及更高版本):

NSString *udid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

方案一生成一个随机UUID,而方案二提供一个固定UID,不会改变。


1
虽然 identifierForVendor 在后续调用中返回固定的 UID,但它并不能唯一地标识设备。如果您删除所有供应商的应用程序并重新安装它们,它将发生变化。 - Miros

2
最好的方法是这样做:
NSString *udid = [[[UIDevice currentDevice]identifierForVendor]UUIDString];

这已经被DZenBotAnc Ainu的回答所建议。 - p.s.w.g

1

1

0

请记住,在IOS 5中,UDID已被弃用。在iOS 7中,当查询MAC地址时,苹果现在总是返回一个固定值,以特别防止使用MAC地址作为ID的方案。因此,您现在应该使用-[UIDevice identifierForVendor]或创建每次安装的UUID。希望对某些人有所帮助。


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