I'm develop application for jailbroken iOS devices. I use https://github.com/erica/uidevice-extension/blob/master/UIDevice-IOKitExtensions.m to get IMEI, but on iPhone 5 this solution does not work(return empty string). Is there any way to get IMEI on iPhone 5(iOS 6.1.2)?
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.