2012-05-10 1 views
0

Я пытаюсь использовать XMPPFramework для отображения фоновых уведомлений в окне «10 минут» до того, как приложение будет завершено. Похоже, что все сетевые запросы ставятся в очередь, когда они находятся в фоновом режиме, и xmppStream:didReceiveMessage: не вызывается, пока приложение не будет возвращено на передний план.XMPPFramework background Поддержка UILocalNotification без ключа VoIP plist

Я заметил, что приложения, подобные глаголам, поддерживают это поведение. Они явно не приложение VoIP, поэтому мне интересно, как они справились с этим поведением.

+0

Почему только «10 минут окна». можем ли мы увеличить его до более? – iChirag

ответ

3

Если у кого-то еще есть эта проблема, вы можете решить ее, добавив этот код в свой делегат приложения. Мой полный исходный код здесь, если вы хотите его проверить: OTRAppDelegate.m. Другой соответствующий код находится в receiveMessage: от OTRBuddy.m.

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    NSLog(@"Application entered background state."); 
    NSAssert(self.backgroundTask == UIBackgroundTaskInvalid, nil); 
    self.didShowDisconnectionWarning = NO; 

    self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"Background task expired"); 
      if (self.backgroundTimer) 
      { 
       [self.backgroundTimer invalidate]; 
       self.backgroundTimer = nil; 
      } 
      [application endBackgroundTask:self.backgroundTask]; 
      self.backgroundTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerUpdate:) userInfo:nil repeats:YES]; 
    }); 
} 

- (void) timerUpdate:(NSTimer*)timer { 
    UIApplication *application = [UIApplication sharedApplication]; 

    NSLog(@"Timer update, background time left: %f", application.backgroundTimeRemaining); 

    if ([application backgroundTimeRemaining] < 60 && !self.didShowDisconnectionWarning) 
    { 
     UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
     if (localNotif) { 
      localNotif.alertBody = EXPIRATION_STRING; 
      localNotif.alertAction = OK_STRING; 
      [application presentLocalNotificationNow:localNotif]; 
     } 
     self.didShowDisconnectionWarning = YES; 
    } 
    if ([application backgroundTimeRemaining] < 10) 
    { 
     // Clean up here 
     [self.backgroundTimer invalidate]; 
     self.backgroundTimer = nil; 
     [application endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    } 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 

} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    /* 
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    */ 
    NSLog(@"Application became active"); 
    if (self.backgroundTimer) 
    { 
     [self.backgroundTimer invalidate]; 
     self.backgroundTimer = nil; 
    } 
    if (self.backgroundTask != UIBackgroundTaskInvalid) 
    { 
     [application endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    } 

    application.applicationIconBadgeNumber = 0; 
} 

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

  • Нет связанных вопросов^_^