最近遗憾的几个问题,求大神帮解答下


#1

看到网上使用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么,这里为什么要导入,如果我导入了,是不是就不会调用手机里面的了,(求大神帮解答下我的疑问!!!)