UIDevice類提供了一些API,使你能夠跟蹤裝置的特徵,包括電池的狀態和接近度感測器。他們二者都以通知的形式提供更新,可以訂閱他們,以便在有重要的更新時通知你的應用程式。
1》啟動和禁用接近度感測器
接近度在此時是一個特定於iPhone的特性。iPod Touch和iPad沒有提供接近度感測器。除非具有相對身體部位握持iPhone的某個迫切的理由(或者反之亦然),否則使用接近度感測器獲益甚少。
當啟用接近度感應器時,它具有一項主要的任務。他會檢測正前方是否有較大的物體。如果是,他將會關閉螢幕,併傳送一個普通的通知。把阻擋的物體移開,將會再次開啟螢幕。
下面的例子演示了在iPhone上如何處理接近度感測。他的程式碼使用UIDevice類切換接近度監測,並且訂閱UIDeviceProximityStateDidChangeNotification 以捕獲狀態改變。兩種狀態是開和關。當UIDevice proximityState屬性返回YES時,就啟用可接近度感測器。
2》監測電池狀態
可以以程式設計方式跟蹤電池和裝置狀態。這些API使你能夠知道電池充電的程度,以及裝置是否插入到了充電電源中。電池電量是一個範圍在1.0(完全充電)~0.0(完全放電)之間的浮點值。它提供了一個近似放電水平,在執行講給裝置施加罕見重負的操作之錢,可以查詢他。
NSLog(@"Battery level:%0.2f%",[UIDevice currentDevice].batteryLevel*100);
充電狀態具有四個可能的值:正在充電(既連線到電源),充滿,拔掉電源插頭和籠統的“未知狀態”。可以使用UIDevice batteryState屬性取回這些狀態
SArray *stateArray = @[@"battery state is unknown", @"battery is not plugged into a charging source", @"battery is charging" @"battery state is full"]; NSLog(@"Battery state:%@",stateArray[[UIDevice currentDevice].batteryState]);
可以通過響應電池狀態改變的通知,輕鬆地監測狀態改變。這樣,就可以捕獲瞬時事件,比如當電池最終充滿電時,當使用者插入電源充電時,以及當使用者斷開與電源的連線時。
要開始監測,可以把batteryMonitoringEnabled屬性設定為YES,在監測期間,當電池狀態或電量改變時,UIDevice類將產生通知。也可以直接檢查這些值,而不必等待通知。
- (void)viewDidLoad { [self updateTitle]; // Add proximity state checker [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceProximityStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { NSLog(@"The proximity sensor %@", [UIDevice currentDevice].proximityState ? @"will now blank the screen" : @"will now restore the screen"); }]; // Enable battery monitoring [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; // Add observers for battery state and level changes [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceBatteryStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { NSLog(@"Battery State Change"); [self peekAtBatteryState]; }]; [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceBatteryLevelDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { NSLog(@"Battery Level Change"); [self peekAtBatteryState]; }];
- (void) peekAtBatteryState { NSArray *stateArray = @[@"Battery state is unknown", @"Battery is not plugged into a charging source", @"Battery is charging", @"Battery state is full"]; NSString *status = [NSString stringWithFormat:@"Battery state: %@, Battery level: %0.2f%%", stateArray[[UIDevice currentDevice].batteryState], [UIDevice currentDevice].batteryLevel * 100]; NSLog(@"%@", status); }
- (void) updateTitle { self.title = [NSString stringWithFormat:@"Proximity %@", [UIDevice currentDevice].proximityMonitoringEnabled ? @"On" : @"Off"]; } - (void) toggle: (id) sender { // Determine the current proximity monitoring and toggle it BOOL isEnabled = [UIDevice currentDevice].proximityMonitoringEnabled; [UIDevice currentDevice].proximityMonitoringEnabled = !isEnabled; [self updateTitle]; }