2012-07-10 49 views
1

當後臺任務即將過期時,iOS應用程序可以調度本地通知嗎? 基本上我有一些服務器端正在進行下載,當應用程序進入後臺使用NSOperationQueue。
我想要的是當本地通知後臺任務即將完成時通知用戶。因此,該用戶可以將應用程序前臺,以保持服務器數據的持續下載
下面是我正在使用的代碼,但我沒有看到任何本地通知後臺任務即將到期時的本地通知

UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      /*TO DO 
      prompt the user if they want to continue syncing through push notifications. This will get the user to essentially wake the app so that sync can continue. 
      */ 
      // create the notification and then set it's parameters 
      UILocalNotification *beginNotification = [[[UILocalNotification alloc] init] autorelease]; 
      if (beginNotification) { 
       beginNotification.fireDate = [NSDate date]; 
       beginNotification.timeZone = [NSTimeZone defaultTimeZone]; 
       beginNotification.repeatInterval = 0; 
       beginNotification.alertBody = @"App is about to exit .Please bring app to background to continue dowloading"; 
       beginNotification.soundName = UILocalNotificationDefaultSoundName; 
       // this will schedule the notification to fire at the fire date 
       //[app scheduleLocalNotification:notification]; 
       // this will fire the notification right away, it will still also fire at the date we set 
       [application scheduleLocalNotification:beginNotification]; 
      } 

      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 
+0

你能解決這個問題嗎?我的意思是從後臺安排本地通知? – 2014-03-01 10:54:07

回答

0

你的代碼永遠不會被執行,因爲你安排你的代碼在將來運行,然後你通過endBackgroundTask:終止您backoground任務。此外,到期處理程序在主線程中調用,因此您可以簡單地將代碼放在那裏,並避免這個dispatch_asyncperformSelectorOnMainThread: foobar。

+0

塊處理程序基本上在後臺線程上調用,因此任何UI更改都需要在主線程上顯式實現,即使用dispatch_sync。 – Ritika 2012-07-12 07:16:07

+0

文檔說明:「每次調用此方法必須通過與endBackgroundTask方法匹配的調用進行平衡:運行後臺任務的應用程序有足夠的時間來運行它們,如果您沒有在時間之前調用endBackgroundTask:系統殺死應用程序,如果你在處理程序參數中提供了一個塊對象,系統會在時間到期之前調用你的處理程序,以便讓你有機會結束這個任務。
我應該什麼時候這樣做。爲什麼我不能在當前時間看到本地通知? – Ritika 2012-07-12 07:19:04

5

我相信你的代碼問題是dispatch_async調用。下面是從文檔的內容:

-beginBackgroundTaskWithExpirationHandler:
(...)的處理程序同步調用在主線程,從而暫時阻止該應用程序的暫停在該應用的通知。

這意味着您的應用程序在此過期處理程序完成後立即掛起。您正在主隊列上提交異步塊,並且因爲這個實際的主隊列(請參閱文檔),它將在稍後後執行

解決方案不是調用dispatch_async,而是直接在該處理程序中運行該代碼。

我看到的另一個問題是,通知過期處理程序中的用戶已經太晚了,應該在到期前完成(如一分鐘左右)。您只需定期檢查backgroundTimeRemaining,並在達到您的間隔時顯示此警報。