1、加入IOKit.framework
2、
io_registry_entry_t rootEntry = IORegistryGetRootEntry(kIOMasterPortDefault);
IORegistryEntryGetName(rootEntry,name); //获取名称
[self findChild:rootEntry level:0];
3、
-(void) findChild:(io_registry_entry_t) parent level:(int) iLevel{
io_iterator_t iterator;
io_name_t name;
IORegistryEntryGetChildIterator(parent,kIOServicePlane,&iterator);
io_iterator_t t = IOIteratorNext(iterator);
while(t!=0){
IORegistryEntryGetName(t,name);
for(int i=0;i<iLevel;i++){
printf("--");
}
printf("|%s\n", name);
//获取属性
CFTypeRef IORegistryEntrySearchCFProperty(
io_registry_entry_t entry,
const io_name_t plane,
CFStringRef key,
CFAllocatorRef allocator,
IOOptionBits options );
if([self compareCharArray:name to:"IOAccessoryPortSerial"]){
[Util showAlertDialog:@"RegistryEntry" aMessage:[NSString stringWithFormat:@" retain count=%d", [(NSString*)t retainCount]]];
CFTypeRef typeRef = nil;
typeRef = IORegistryEntrySearchCFProperty(
t,
kIOServicePlane,
CFSTR("IOAccessoryDevicePort"),
kCFAllocatorDefault,
kIORegistryIterateRecursively);
[Util showAlertDialog:@"IOkit" aMessage:[NSString stringWithFormat:@"%@", (CFNumberRef)typeRef]];
}
[self findChild:t level:iLevel+1];
t = IOIteratorNext(iterator);
}
4、没有发现遍历属性的方法