Select Page

In iOS 5+ Apple deprecated usage of the device UDID. It appears Apple started rejecting apps for using the UDID. The way to get an unique device id was:

1
NSString *UDID = [[UIDevice currentDevice] uniqueIdentifier];

It appears this might get your app rejected… (See also: http://techcrunch.com/2012/03/24/apple-udids/ )

Lot’s of app developers need a way to figure out an unique identifier for devices for various reasons. Being able to identify a device is very useful for throttling usage of a back-end service for example. It enables us (app devs) to prevent misuse of our app back-end servers by monitoring (extreme) use from devices, and act on that if necessary. It is also very nice to be able to figure out on how many unique devices your app is deployed. Apple now wants us to generate an ID for an app. That is not as useful as a device id, because it does not get us to the 2 goals described above.

An UDID replacement. If we can’t use the UDID from Apple, a replacement would be nice. A replacement might be the MAC address from the device. It is not as solid as the device UDID because on a device with a jailbreak it probably is possible to change the MAC address. But on the other hand, you probably don’t want to have your app running on a jaibroken device anyway! Below the code for a helper class that get’s you the MAC address from the device. This code snippet i found on http://iphonedevelopertips.com/device/determine-mac-address.html  . I have tested it with the iPhone and the iPad. I have NOT submitted an app with this code yet! If you do, please let me know by adding a comment.

Header

1
2
3
4
5
6
7
8
9
10
11
//
//  MacAddressHelper.h
//
 
#import <Foundation/Foundation.h>
 
@interface MacAddressHelper : NSObject
 
+ (NSString *)getMacAddress;
 
@end

Implementation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//
//  MacAddressHelper.m
//
 
#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

Usage: just add these 2 files to your project and import the header file.
Then call [MacAddressHelper getMacAddress] , this will return the MAC address.

1
2
3
#import "MacAddressHelper.h"
 
NSLog(@"MAC address: %@",[MacAddressHelper getMacAddress]);