2012-05-10 3 views
0

XMPPFrameworkを使用して、アプリケーションが終了する前に「10分のウィンドウ」に背景通知を表示しようとしています。すべてのネットワークリクエストがバックグラウンドでキューに入れられているように見え、xmppStream:didReceiveMessage:は、アプリがフォアグラウンドに戻されるまで呼び出されていません。XMPPFramework背景VoIP plistキーのないUILocalNotificationのサポート

私は動詞のようなアプリがこの動作をサポートしていることに気付きました。彼らは明らかにVoIPアプリケーションではないので、私は彼らがこの動作をどのように達成したかについて興味があります。

+0

なぜ「10分ウィンドウ」だけですか。 それ以上に増やすことはできますか? – iChirag

答えて

3

誰かがこの問題を抱えている場合は、このコードをApp Delegateに追加することで解決できます。あなたがチェックアウトしたい場合、私の完全なソースコードはOTRAppDelegate.mです。その他の関連コードは、OTRBuddy.mのreceiveMessage:にあります。

- (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; 
} 
関連する問題