1

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

我在周围找到了一些代码并将其转换为此代码,并在 iPhone 4s 上对其进行了测试,但它确实有效,任何人都可以看到此代码不起作用的任何原因吗?

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;
4

0 回答 0