IOS 特定於裝置的開發:檢查裝置接近度和電池狀態

haibo wang發表於2014-12-22

   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];
}

 

相關文章