UIDeviceBatteryLevelDidChangeNotification проблема, когда приложение идет в фоновом режиме

Я хочу подать сигнал тревоги, когда уровень заряда батареи достигнет 100 % (для тестирования я установил его на уровне 11% или более) и зарядное устройство не снято.

Он работает нормально, когда приложение находится на переднем плане, но останавливается, когда приложение достигает фона.

Кто-нибудь может помочь, пожалуйста.

Мой код, как показано ниже для viewcontroller.

    //
//  MainViewController.m
//  GoGreen
//
//  Created by nbtmac on 25/05/15.
//  
//

#import "MainViewController.h"


@interface MainViewController ()
{
    int timerCount;
    float batteryLevel;
    NSString *userID;
    NSDate *chargedAt;
    NSInteger chargedHr;
    NSInteger chargedMin;
    NSTimer* alarmTimer;
    SystemSoundID _soundId;
}

@end

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self.tabBarController.tabBar setHidden:false];


    [self createSoundId];


}




- (void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    [self.tabBarController.tabBar setHidden:false];
    self.navigationItem.hidesBackButton = true;

    [UIDevice currentDevice].batteryMonitoringEnabled = YES;


    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(batteryLevelChanged:)
                                                 name:UIDeviceBatteryLevelDidChangeNotification object:nil];


    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(batteryStateChanged:)
                                                 name:UIDeviceBatteryStateDidChangeNotification object:nil];


}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

#pragma mark - Misc Methods




- (void) createSoundId
{
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Loud_Alarm_Clock_Buzzer" ofType:@"wav"];
    if ([[NSFileManager defaultManager] fileExistsAtPath:soundPath])
    {
        NSURL* soundPathURL = [NSURL fileURLWithPath:soundPath];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundPathURL, &_soundId);
    }
}

-(void) alarmTimer:(NSTimer*) alarmTimer
{

    timerCount++;

    AudioServicesPlaySystemSound(_soundId);

}


- (void)batteryLevelChanged:(NSNotification *)notification
{
    batteryLevel = (([UIDevice currentDevice].batteryLevel) * 100);
    if (batteryLevel >= 11.00)
    {

        NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]];
        chargedHr = [components hour];
        chargedMin = [components minute];

        if (timerCount < 1)
        {

        alarmTimer = [NSTimer scheduledTimerWithTimeInterval: 60.0 * 1 target: self
                                                          selector: @selector(alarmTimer:) userInfo: nil repeats: YES];
        }
        [UIApplication sharedApplication].idleTimerDisabled = YES;
    }

}

- (void)batteryStateChanged:(NSNotification *)notification
{


    UIDeviceBatteryState currentState = [UIDevice currentDevice].batteryState;
    if (currentState == UIDeviceBatteryStateFull)
    {

    }
    else if (currentState == UIDeviceBatteryStateUnplugged)
        {
            [alarmTimer invalidate];
            [UIApplication sharedApplication].idleTimerDisabled = NO;


            batteryLevel = (([UIDevice currentDevice].batteryLevel) * 100);
            NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]];
            NSInteger unPlugHr = [components hour];
            NSInteger unPlugMin = [components minute];
            NSInteger totUnPlugMins = (unPlugHr * 60) + unPlugMin;
            NSInteger totChargedMins = (chargedHr * 60) + chargedMin + 1;



            if ((batteryLevel >= 100.00) && (totChargedMins > totUnPlugMins))
            {
                if(appDelegate().isInternetReachable)
                {




                }
                else
                {
                    [[Util okAlert:@"Error" message:@"Please check your internet connection."] show];

                }
            }
        }

}





@end

Спасибо

Nirav

1 ответ

Когда ваше приложение переходит в фоновый режим - практически весь ваш код приостанавливается. Вам нужно будет сделать дополнительную работу для этого, используя UILocalNotifications или что-то подобное, чтобы получать уведомления о будущих событиях, пока приложение остается в фоновом режиме.

Другие вопросы по тегам