2015-10-27 54 views
1

我正在尝试在iOS 9.1下使用BatteryCenter和​​私有框架并借助nst's iOS Runtime Headers。这是出于研究目的,并不会让它进入AppStore。私有iOS框架返回NULL

这里有各自的代码:

- (void)batteryCenter { 
NSBundle *bundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/BatteryCenter.framework"]; 
BOOL success = [bundle load]; 

    if(success) { 
     Class BCBatteryDevice = NSClassFromString(@"BCBatteryDevice"); 
     id si = [[BCBatteryDevice alloc] init]; 

     NSLog(@"Charging: %@", [si valueForKey:@"charging"]); 
    } 
} 


- (void)commonUtilities { 
    NSBundle *bundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/CommonUtilities.framework"]; 
    BOOL success = [bundle load]; 

    if(success) { 
     Class CommonUtilities = NSClassFromString(@"CUTWiFiManager"); 
     id si = [CommonUtilities valueForKey:@"sharedInstance"]; 

     NSLog(@"Is Wi-Fi Enabled: %@", [si valueForKey:@"isWiFiEnabled"]); 
     NSLog(@"Wi-Fi Scaled RSSI: %@", [si valueForKey:@"wiFiScaledRSSI"]); 
     NSLog(@"Wi-Fi Scaled RSSI: %@", [si valueForKey:@"lastWiFiPowerInfo"]); 
    } 
} 

虽然我得到的类回去,他们所有的尊重数值是NULL这是奇怪的,因为有些必须是真实的,例如我已连接到Wi-Fi,因此isWiFiEnabled应该是YES

错过了什么,我的代码没有返回什么期望?它是否需要权利?如果是这样的话?

回答

0

执行成功块后,您需要先访问BCBatteryDeviceController,通过该块可以获取所有连接设备的列表。

以下是相同的代码。

Class CommonUtilities = NSClassFromString(@"BCBatteryDeviceController"); 

id si = [CommonUtilities valueForKey:@"sharedInstance"]; 

BCBatteryDeviceController* objBCBatteryDeviceController = si; 

NSLog(@"Connected devices: %@", objBCBatteryDeviceController.connectedDevices); 
2

在斯威夫特,我设法得到这个工作没有BatteryCenter标题。我仍然在寻找一种方式来访问连接电池的列表,而无需使用BCBatteryDeviceController,但是这是我迄今为止的工作:

斯威夫特3:

guard case let batteryCenterHandle = dlopen("/System/Library/PrivateFrameworks/BatteryCenter.framework/BatteryCenter", RTLD_LAZY), batteryCenterHandle != nil else { 
    fatalError("BatteryCenter not found") 
} 

guard let batteryDeviceControllerClass = NSClassFromString("BCBatteryDeviceController") as? NSObjectProtocol else { 
    fatalError("BCBatteryDeviceController not found") 
} 

let instance = batteryDeviceControllerClass.perform(Selector(("sharedInstance"))).takeUnretainedValue() 

if let devices = instance.value(forKey: "connectedDevices") as? [AnyObject] { 

    // You will have more than one battery in connectedDevices if your device is using a Smart Case 
    for battery in devices { 
     print(battery) 
    } 
} 

雨燕2.2:

guard case let batteryCenterHandle = dlopen("/System/Library/PrivateFrameworks/BatteryCenter.framework/BatteryCenter", RTLD_LAZY) where batteryCenterHandle != nil else { 
    fatalError("BatteryCenter not found") 
} 

guard let c = NSClassFromString("BCBatteryDeviceController") as? NSObjectProtocol else { 
    fatalError("BCBatteryDeviceController not found") 
} 

let instance = c.performSelector("sharedInstance").takeUnretainedValue() 
if let devices = instance.valueForKey("connectedDevices") as? [AnyObject] { 

    // You will have more than one battery in connectedDevices if your device is using a Smart Case 
    for battery in devices { 
     print(battery) 
    } 
} 

此日志:

<BCBatteryDevice: 0x15764a3d0; vendor = Apple; productIdentifier = 0; parts = (null); matchIdentifier = (null); baseIdentifier = InternalBattery-0; name = iPhone; percentCharge = 63; lowBattery = NO; connected = YES; charging = YES; internal = YES; powerSource = YES; poweredSoureState = AC Power; transportType = 1 >