2014-10-07 2 views
0

У меня проблема с тем, что мой NSTimer не работает, когда приложение работает в backgroud. на симуляторе это работа, на устройстве это не так.NSTimer не работает в фоновом режиме

мой код на AppDelegate.m:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    NSLog(@"enter background"); 

    notiTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(checkNotification) userInfo:nil repeats:YES]; 
    [[NSRunLoop mainRunLoop] addTimer:notiTimer forMode:NSDefaultRunLoopMode]; 
} 

и метод, который я пытаюсь запустить в цикле:

-(void)checkNotification { 

    NSLog(@"running loop in bg"); 

    userdetails =[NSUserDefaults standardUserDefaults]; 
    userid = [userdetails objectForKey:@"userid"]; 
    username = [userdetails objectForKey:@"username"]; 
    if (userid != NULL && username != NULL) { 

     notifString = [NSString stringWithFormat:@"userid=%@", userid]; 
     notifData = [NSData dataWithBytes: [notifString UTF8String] length: [notifString length]]; 
     urlreq = [[NSMutableURLRequest alloc] initWithURL:notifUrl]; 
     [urlreq setHTTPMethod: @"POST"]; 
     [urlreq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
     [urlreq setHTTPBody: notifData]; 
     sendreq = [NSURLConnection sendSynchronousRequest:urlreq returningResponse:nil error:nil]; 
     response =[[NSString alloc] initWithBytes:[sendreq bytes] length:[sendreq length] encoding:NSUTF8StringEncoding]; 
     responsTrimmed = [response stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
     splitResponse = [responsTrimmed componentsSeparatedByString: @","]; 
     if ([splitResponse[0] isEqualToString:@"1"]) { 
      NSLog(@"%@",splitResponse[1]); 
     } 
     else { 
      NSLog(@"err"); 
     } 
    } 

} 

сейчас раз в приложении войти фону я получаю в отладчике NSLog:

NSLog(@"enter background"); 

, но цикл запуска не работает, и метод не вызывает в цикле, и я не получаю NSLo g

NSLog(@"running loop in bg"); 

на отладчике, любая идея?

+1

Да, конечно, нет, когда приложение переходит на задний план, оно приостановлено, включая все 'NSTimer'. есть некоторые службы, которые могут запускаться _after_, приложение становится неактивным, но 'NSTimer' не входит в список. – holex

ответ

4

Когда ваше приложение идет в фоновом режиме, оно «заморожено» ОС, поэтому никакая задача не может быть выполнена обычным способом. Само приложение должно объявить, как он обрабатывает фоновую задачу, но вы ограничены одной из этой ситуации:

  • вам нужно небольшое количество времени (обычно менее 10 минут): вы можете просто попросить его
  • вашего приложения что-то загрузка: вы можете попросить систему, чтобы продолжить загрузку для вас
  • немного набора задач может выполняться в фоновом режиме, но вы должны указать его в проекте

Таким образом, в чтобы выполнить некоторый код, вы должны tart a фоновая задача в момент выхода.

Here is the Apple documentation для выполнения фона, надеюсь, он может вам помочь.

Смежные вопросы