2011-05-06 40 views
2

我使用ASIHTTPRequest在iPhone應用程序在後臺運行時下載多個文件。隊列結束時,我想提供一個UILocalNotification。 以下委託方法不叫,直到應用程序恢復:ASINetworkQueue完成所有請求時如何顯示UILocalNotification?

- (void)queueFinished:(ASINetworkQueue *)aQueue 
{ 

    NSLog(@"Queue finished"); 

    if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { 
     UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
     localNotification.alertBody = NSLocalizedString(@"All downloads completed");   
     [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; 
     [localNotification release]; 
    } 
} 

所以,我怎樣才能使這個通知出現在哪裏?

回答

0

從以前的SO質疑notification when program is in background iOS 4

你一定要明白,當你的應用程序處於暫停狀態,您將不會收到任何通知 - 這是文檔權利英寸只有3類可以接收通知的應用程序:音頻應用程序(如iPod和模擬),基於位置的應用程序和VoIP應用程序。如果您的應用程序是其中一個應用程序,則必須正確設置plist。

+0

對不起,但這個答案太泛泛,並沒有解決我的具體問題。我知道如何顯示本地通知。我猜爲什麼委託方法不在後臺調用的原因是因爲它是用'performSelectorOnMainThread'調用的。 – Felix 2011-05-06 16:17:31

0

使用此:

UILocalNotification *localNot = [[UILocalNotification alloc] init]; 
localNot.alertBody = @"Your Text"; 
localNot.alertAction = @"Name on the button"; 
localNot.fireDate = [NSDate date]; 
localNot.soundName = UILocalNotificationDefaultSoundName; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNot]; 

你在做什麼:

  • 創建LocalNotification
  • 添加您的LN
  • 的身體添加出現在按鈕的名稱「警報」
  • 將fireDate設置爲實際的日期和時間(也許您需要增加實際日期1或2秒 - 用於該用途:dateByAddingTimeInterval:
  • 設置soundName(您也可以使用自定義的聲音......)
  • 計劃/創建LN
+0

我的問題不是_how_顯示本地通知。實際的問題是如何在後臺運行時調用'queueFinished'。 – Felix 2011-05-06 16:28:51

+0

「如何顯示UILocalNotification ...?」這就是爲什麼我發佈你的問題。 – 2011-05-07 15:12:35

1

的原因,您的委託是不是被叫是可能的,因爲你的應用程序在後臺暫停。如果在用戶關閉應用程序後繼續執行某種冗長的網絡過程,則可以在啓動網絡任務時使用-[UIApplication beginBackgroundTaskWithExpirationHandler:],以便在完成網絡任務之前,應用程序會繼續在後臺運行。但是,它仍然可能會過期,因此您不能保證有足夠的時間完成。

+0

我知道_ASIHTTPRequest_在用'[request setShouldContinueWhenAppEntersBackground:YES]'配置請求'時調用'beginBackgroundTaskWithExpirationHandler'。在後臺下載文件很好,但我仍然無法顯示通知。 – Felix 2011-05-06 16:32:37

+0

不知道ASIHTTPRequest的這個特性。在那種情況下,我不確定它爲什麼不起作用。 – 2011-05-06 18:48:19

0

你有你的隊列maxConcurrentOperationCount設置爲1嗎?

方法setShouldContinueWhenAppEntersBackground:YES是在每個請求的基礎上設置的,並且由於在隊列中有一堆ASIHTTPRequest,所以一次只能執行其中的一個。這意味着您的隊列中的其他項目在您暫停應用程序時甚至還沒有開始,因此操作系統不知道是否仍然保持該網絡請求活着。

我不確定是否有解決方案,但我認爲這是您看到的原因。

相關問題