airwash3008
airwash3008

Reputation: 33

iOS MDM: Common key/id for iOS MDM and supporting MDM iOS application

I am working on MDM solution and I am facing the UDID issue. We have an iOS application which is as supporting application for iOS MDM server.This supporting application can be launched after the iOS device is enrolled for MDM with our MDM server.

In device enrollment we can get device UDID at server side and we are using this device UDID as a common key for both iOS MDM and iOS Supporting application. To login with our MDM server in iOS supporting application user has to provide userid,password and UDID we are capturing using the api [[UIDevice currentDevice] uniqueIdentifier], so for authentication these 3 parameters are required.

But apple has deprecated the device UDID in iOS 5.0,so we can't use the apple API to capture the device UDID in iOS application.

Now we need some common key which is available in iOS MDM certificate and which which we can generate in iOS supporting application. So that which user has enrolled the iOS device with MDM server, only that user should be able to login in the iOS Supporting application.

Upvotes: 3

Views: 1262

Answers (1)

User97693321
User97693321

Reputation: 3346

You can use wifi mac address also as replacement of UDID.The logic to get mac address is as below,which you can use in your supporting iOS application to get mac address. You can wifi mac address in server side using MDM command.

//.h file

#import <Foundation/Foundation.h>

@interface MacAddress : NSObject

+ (NSString *)getMacAddress;

@end

//implentation file

#import "MacAddress.h"
#import <sys/socket.h>
#import <sys/sysctl.h>
#import <net/if.h>
#import <net/if_dl.h>

@implementation MacAddress

+ (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

Upvotes: 3

Related Questions