Getting Device ID or Mac Address in iOS [duplicate] Getting Device ID or Mac Address in iOS [duplicate] objective-c objective-c

Getting Device ID or Mac Address in iOS [duplicate]


[[UIDevice currentDevice] uniqueIdentifier] is guaranteed to be unique to each device.


uniqueIdentifier (Deprecated in iOS 5.0. Instead, create a unique identifier specific to your app.)

The docs recommend use of CFUUIDCreate instead of [[UIDevice currentDevice] uniqueIdentifier]

So here is how you generate an unique id in your app

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

Note that you have to save the uuidString in user defaults or in other place because you can not generate the same uuidString again.

You can use UIPasteboard to store your generated uuid. And if the app will be deleted and reinstalled you can read from UIPasteboard the old uuid. The paste board will be wiped out when the device will be erased.

In iOS 6 they have introduced the NSUUID Class that is designed to create UUIDs strings

Also they added in iOS 6 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor to the UIDevice class

The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.

The value of this property may be nil if the app is running in the background, before the user has unlocked the device the first time after the device has been restarted. If the value is nil, wait and get the value again later.

Also in iOS 6 you can use ASIdentifierManager class from AdSupport.framework. There you have

@property(nonatomic, readonly) NSUUID *advertisingIdentifier

Discussion Unlike the identifierForVendor property of the UIDevice, the same value is returned to all vendors. This identifier may change—for example, if the user erases the device—so you should not cache it.

The value of this property may be nil if the app is running in the background, before the user has unlocked the device the first time after the device has been restarted. If the value is nil, wait and get the value again later.

Edit:

Pay attention that the advertisingIdentifier may return

00000000-0000-0000-0000-000000000000

because there seems to be a bug in iOS. Related question: The advertisingIdentifier and identifierForVendor return "00000000-0000-0000-0000-000000000000"


For a Mac Adress you could use

#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

Use:

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