There are several ways to get IMEI on newer devices
1) Private ManagedConfiguration.framework
CFStringRef MCCTIMEI()
2) CoreTelephony.framework
struct CTResult
{
int flag;
int a;
};
extern CFStringRef kCTMobileEquipmentInfoIMEI;
void *connection = _CTServerConnectionCreate(kCFAllocatorDefault, NULL, NULL);
NSDictionary *info = nil;
struct CTResult result;
_CTServerConnectionCopyMobileEquipmentInfo(&result, connection, &info);
[info autorelease];
CFRelease(connection);
NSString* IMEI = (NSString*)info[(NSString*)kCTMobileEquipmentInfoIMEI];
3) liblockdown.dylib
extern CFStringRef kLockdownIMEIKey;
void* connection = lockdown_connect();
NSString* IMEI = [(NSString*)lockdown_copy_value(connection, NULL, kLockdownIMEIKey) autorelease];
lockdown_disconnect(connection);
I had some problems with MCCTIMEI
- returned empty IMEI after device start-up. Now I'm using CoreTelephony solution, never had a problem with it.
UPDATE
On iOS 7 these APIs are protected by com.apple.coretelephony.Identity.get
entitlement. To access IMEI (IMSI, phone number and other info) you need to sign your with that entitlement with boolean value set to true.