In ios5, udid is no longer recommended. In future versions, this function may disappear. So we need to find a replacement method that uniquely identifies a device. Generally, the hardware has a unique identifier, so we can replace the udid with the hardware information, and the MAC address on the hardware can achieve this purpose.
The following function returns a string of the XX: XX type (12 hexadecimal numbers)
#include <sys/socket.h>#include <sys/sysctl.h>#include <net/if.h>#include <net/if_dl.h> ... - (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;}
Source code: http://iphonedevelopertips.com/device/determine-mac-address.html
The system SKD also provides a way to obtain the identifier string (udid), as follows:
[[UIDevice currentDevice] uniqueIdentifier]
However, when you open uidevice. H, you will find such definitions and annotations.
@property(nonatomic,readonly,retain) NSString *uniqueIdentifier __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_5_0); // a string unique to each device based on various hardware info.
This indicates that Apple will gradually remove this attribute.
UUID can also be used in ios4, but it cannot be ensured that it can be used after system upgrade (ios6, 7. I have not tested ios5 yet, because I have no device in my hand (my friend told me the result ).
Here, you can also write the uuid method:
-(NSString*) uuid{CFUUIDRef puuid = CFUUIDCreate( nil );CFStringRef uuidString = CFUUIDCreateString( nil, puuid );NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);CFRelease(puuid);CFRelease(uuidString);return [result autorelease];}
There are two concepts: UUID and udid.
UUID is a universal unique identifier code of the universally unique identifier.
Udid is the unique identifier of the unique device identifier device.
Udid is only a set of UUID.
All I know is to use these methods to uniquely identify the device. If you have a better method, I hope you can share it with us.