看到网上使用iokit获取序列号的方法,具体代码如下:
NSArray *getValue(NSString *iosearch)
{
mach_port_t masterPort;
CFTypeID propID = (CFTypeID) NULL;
signed long bufSize;
kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &masterPort);
if (kr != noErr) return nil;
io_registry_entry_t entry = IORegistryGetRootEntry(masterPort);
if (entry == MACH_PORT_NULL) return nil;
CFTypeRef prop = IORegistryEntrySearchCFProperty(entry, kIODeviceTreePlane, (__bridge CFStringRef) iosearch, nil, kIORegistryIterateRecursively);
if (!prop) return nil;
propID = CFGetTypeID(prop);
if (!(propID == CFDataGetTypeID()))
{
mach_port_deallocate(mach_task_self(), masterPort);
return nil;
}
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];
mach_port_deallocate(mach_task_self(), masterPort);
return [p1 componentsSeparatedByString:@"\0"];
}
+ (NSString *)getValue:(NSString *)key{
NSArray *results = getValue(key);
if (results) return [results objectAtIndex:0];
return nil;
}
我进行调用用的时候,使用"serial-number"作为参数可以正常获取序列号,但当我使用"device-imei"却获取不到值,我都是按照网上方法去获取的,请问哪里出了问题,应该不是沙盒问题,因为我注入到设置应用里面也是一样的,而且我去hook了IORegistryEntrySearchCFProperty方法,发现根本就没有调用"device-imei"这个key,我运行的环境是ios9.3.1,xcode8.3.3. 1--------还有个问题我不太明白,就是我使用私有库iokit的时候,我光导入iokit的头文件为什么不行,xcode编译不通过,为什么要导入可执行的文件,编译不是只需要头文件就可以了么,具体是到调用的时候去检测方法实现的么把,(比较系统的UIKIT框架,为什么xcode里面一份,手机里面也有一份,这个原理我不清楚,难道编译生成可执行文件的时候,所有导入的framework的可执行文件都参与其中么???)2---------我是老版本的xcode中去把iokit拉取出来,放到工程中的,这个我感觉不太好,我想直接从手机中获取这个framework有什么好方法,3-------我有个疑问就是,这个framework到运行的时候不是调用手机里面dyld_shared_cache_arm64里对应的framework么,这里为什么要导入,如果我导入了,是不是就不会调用手机里面的了,(求大神帮解答下我的疑问!!!)