获取iDevice的IMEI而无需在IOKit中进行链接

时间:2013-03-27 05:46:10

标签: iphone objective-c ipad imei

我正在尝试获取代码运行的ipad的IMEI,但我不想将其链接到那里的应用程序,因为我想动态加载IOKit。

我发现了一些代码并将其转换为此代码,我在iPhone 4s上进行了测试,并且dident工作可以让任何人看到为什么这段代码不能正常工作?

PS我的应用程序不能通过应用程序商店仅作为企业应用程序提供。

mach_port_t          masterPort;
CFTypeID             propID = (CFTypeID) NULL;
unsigned int         bufSize;

void *IOKit = dlopen("/System/Library/Frameworks/IOKit.framework/IOKit", RTLD_NOW);

if(IOKit)
{
    kern_return_t (*kIOMasterPort)( mach_port_t bootstrapPort,mach_port_t * masterPort ) = dlsym(IOKit,"IOMasterPort");

    io_registry_entry_t (*kIORegistryGetRootEntry)(mach_port_t  masterPort ) = dlsym(IOKit,"IORegistryGetRootEntry");

    CFTypeRef (*kIORegistryEntrySearchCFProperty)(io_registry_entry_t   entry,const io_name_t       plane,CFStringRef       key,CFAllocatorRef      allocator, IOOptionBits     options ) =
    dlsym(IOKit,"IORegistryEntrySearchCFProperty");

    kern_return_t kr = kIOMasterPort(MACH_PORT_NULL, &masterPort);

    io_registry_entry_t entry = kIORegistryGetRootEntry(masterPort);

    CFTypeRef prop = kIORegistryEntrySearchCFProperty(entry, "IODeviceTree", (CFStringRef) @"device-imei" , nil, kIORegistryIterateRecursively);

    propID = CFGetTypeID(prop);

    CFDataRef propData = (CFDataRef) prop;
    if (!propData) return nil;

    bufSize = CFDataGetLength(propData);
    if (!bufSize) return nil;

    NSString *p1 = [[[NSString alloc] initWithBytes:CFDataGetBytePtr(propData) length:bufSize encoding:1] autorelease];
    NSLog(@"foo %@" ,p1);
    return [p1 componentsSeparatedByString:@"\0"];
}

// kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &masterPort);

return nil;

0 个答案:

没有答案