在iOS中获取设备ID或Mac地址

我有一个应用程序,使用其余的服务器通信,我想要获得的IPHONE MAC地址或唯一性validation的设备ID,如何做到这一点?

[[UIDevice currentDevice] uniqueIdentifier]保证对每个设备是唯一的。

uniqueIdentifier(在iOS 5.0中不推荐使用,而应该为您的应用程序创build一个唯一的标识符)。

文档build议使用CFUUIDCreate而不是[[UIDevice currentDevice] uniqueIdentifier]

所以这里是你如何在你的应用程序中生成一个唯一的ID

 CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault); NSString *uuidString = (NSString *)CFUUIDCreateString(NULL,uuidRef); CFRelease(uuidRef); 

请注意,您必须将uuidString保存在用户默认值或其他位置,因为不能再次生成相同的uuidString。

您可以使用UIPasteboard来存储您生成的uuid。 如果应用程序将被删除并重新安装,您可以从UIPasteboard中读取旧的uuid。 当设备被擦除时,粘贴板将被擦除。

在iOS 6中,他们引入了用于创buildUUIDstring的NSUUID类

他们还在iOS 6 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor到UIDevice类

对于来自同一设备上运行的同一供应商的应用程序,此属性的值是相同的。 对于来自不同供应商的同一设备上的应用程序以及不同设备上的应用程序,不pipe供应商是什么,都会返回不同的值。

如果应用程序在后台运行,则此属性的值可能为零,用户在重新启动设备后第一次解锁设备。 如果该值为零,稍后再等待并获取该值。

同样在iOS 6中,您可以使用AdSupport.framework中的ASIdentifierManager类。 你有

 @property(nonatomic, readonly) NSUUID *advertisingIdentifier 

讨论与UIDevice的identifierForVendor属性不同,将相同的值返回给所有供应商。 这个标识符可能会改变 – 例如,如果用户擦除设备 – 所以你不应该caching它。

如果应用程序在后台运行,则此属性的值可能为零,用户在重新启动设备后第一次解锁设备。 如果该值为零,稍后再等待并获取该值。

编辑:

请注意, advertisingIdentifier可能会返回

00000000-0000-0000-0000-000000000000

因为在iOS中似乎有一个错误。 相关问题: advertisingIdentifier和identifierForVendor返回“00000000-0000-0000-0000-000000000000”

对于Mac地址,您可以使用

 #import <Foundation/Foundation.h> @interface MacAddressHelper : NSObject + (NSString *)getMacAddress; @end 

implentation

 #import "MacAddressHelper.h" #import <sys/socket.h> #import <sys/sysctl.h> #import <net/if.h> #import <net/if_dl.h> @implementation MacAddressHelper + (NSString *)getMacAddress { int mgmtInfoBase[6]; char *msgBuffer = NULL; size_t length; unsigned char macAddress[6]; struct if_msghdr *interfaceMsgStruct; struct sockaddr_dl *socketStruct; NSString *errorFlag = NULL; // Setup the management Information Base (mib) mgmtInfoBase[0] = CTL_NET; // Request network subsystem mgmtInfoBase[1] = AF_ROUTE; // Routing table info mgmtInfoBase[2] = 0; mgmtInfoBase[3] = AF_LINK; // Request link layer information mgmtInfoBase[4] = NET_RT_IFLIST; // Request all configured interfaces // With all configured interfaces requested, get handle index if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0) errorFlag = @"if_nametoindex failure"; else { // Get the size of the data available (store in len) if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0) errorFlag = @"sysctl mgmtInfoBase failure"; else { // Alloc memory based on above call if ((msgBuffer = malloc(length)) == NULL) errorFlag = @"buffer allocation failure"; else { // Get system information, store in buffer if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0) errorFlag = @"sysctl msgBuffer failure"; } } } // Befor going any further... if (errorFlag != NULL) { NSLog(@"Error: %@", errorFlag); return errorFlag; } // Map msgbuffer to interface message structure interfaceMsgStruct = (struct if_msghdr *) msgBuffer; // Map to link-level socket structure socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1); // Copy link layer address data in socket structure to an array memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6); // Read from char array into a string object, into traditional Mac address format NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]]; //NSLog(@"Mac Address: %@", macAddressString); // Release the buffer memory free(msgBuffer); return macAddressString; } @end 

使用:

 NSLog(@"MAC address: %@",[MacAddressHelper getMacAddress]); 

用这个:

 NSUUID *id = [[UIDevice currentDevice] identifierForVendor]; NSLog(@"ID: %@", id); 

在IOS 5中[[UIDevice currentDevice] uniqueIdentifier]已被弃用。

最好使用-identifierForVendor-identifierForAdvertising

很多有用的信息可以在这里find:

iOS6 UDID – identifierForVendor具有优于identifierForAdvertising的优势吗?

在这里,我们可以findIOS设备的Mac地址使用Asp.net C#代码…

.aspx.cs

 - var UserDeviceInfo = HttpContext.Current.Request.UserAgent.ToLower(); // User's Iphone/Ipad Info. var UserMacAdd = HttpContext.Current.Request.UserHostAddress; // User's Iphone/Ipad Mac Address GetMacAddressfromIP macadd = new GetMacAddressfromIP(); if (UserDeviceInfo.Contains("iphone;")) { // iPhone Label1.Text = UserDeviceInfo; Label2.Text = UserMacAdd; string Getmac = macadd.GetMacAddress(UserMacAdd); Label3.Text = Getmac; } else if (UserDeviceInfo.Contains("ipad;")) { // iPad Label1.Text = UserDeviceInfo; Label2.Text = UserMacAdd; string Getmac = macadd.GetMacAddress(UserMacAdd); Label3.Text = Getmac; } else { Label1.Text = UserDeviceInfo; Label2.Text = UserMacAdd; string Getmac = macadd.GetMacAddress(UserMacAdd); Label3.Text = Getmac; } 

.class文件

 public string GetMacAddress(string ipAddress) { string macAddress = string.Empty; if (!IsHostAccessible(ipAddress)) return null; try { ProcessStartInfo processStartInfo = new ProcessStartInfo(); Process process = new Process(); processStartInfo.FileName = "arp"; processStartInfo.RedirectStandardInput = false; processStartInfo.RedirectStandardOutput = true; processStartInfo.Arguments = "-a " + ipAddress; processStartInfo.UseShellExecute = false; process = Process.Start(processStartInfo); int Counter = -1; while (Counter <= -1) { Counter = macAddress.Trim().ToLower().IndexOf("mac address", 0); if (Counter > -1) { break; } macAddress = process.StandardOutput.ReadLine(); if (macAddress != "") { string[] mac = macAddress.Split(' '); if (Array.IndexOf(mac, ipAddress) > -1) { if (mac[11] != "") { macAddress = mac[11].ToString(); break; } } } } process.WaitForExit(); macAddress = macAddress.Trim(); } catch (Exception e) { Console.WriteLine("Failed because:" + e.ToString()); } return macAddress; }