Как показать UILocalNotification, когда ASINetworkQueue завершает все запросы? - PullRequest
2 голосов
/ 06 мая 2011

Я использую ASIHTTPRequest для загрузки нескольких файлов, пока приложение iPhone работает в фоновом режиме. Я хочу представить 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];
    }
}

Итак, как я могу заставить это уведомление появляться?

Ответы [ 4 ]

1 голос
/ 06 мая 2011

Причина, по которой ваш делегат не вызывается, вероятно, потому что ваше приложение приостановлено в фоновом режиме. Если вы выполняете какой-то длительный сетевой процесс, который продолжается после того, как пользователь закрывает приложение, вы можете использовать -[UIApplication beginBackgroundTaskWithExpirationHandler:] при запуске сетевых задач, чтобы ваше приложение продолжало работать в фоновом режиме, пока вы не закончили с сетевыми задачами. Тем не менее, он все еще может истечь, так что вам не гарантировано достаточно времени, чтобы закончить.

0 голосов
/ 04 января 2012

У вас в очереди maxConcurrentOperationCount установлено значение 1?

Метод setShouldContinueWhenAppEntersBackground: YES устанавливается для каждого запроса, и, поскольку у вас есть набор ASIHTTPRequest внутри очереди, только один из них может выполняться одновременно. Это означает, что другие элементы в вашей очереди даже не запускались, когда вы приостанавливали приложение, поэтому ОС еще не знает, как сохранить этот сетевой запрос.

Я не уверен в решении, но я думаю, что это причина того, что вы видите.

0 голосов
/ 06 мая 2011

Используйте это:

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 голосов
/ 06 мая 2011

Из предыдущего вопроса SO уведомление, когда программа находится в фоновом режиме iOS 4

Вы действительно понимаете, что когда ваше приложение находится в приостановленном состоянии, вы не будете получать никаких уведомлений - иэто правильно в документации.Существует только 3 класса приложений, которые могут получать уведомления: аудиоприложения (например, iPod и аналоги), приложения на основе определения местоположения и приложения VoIP.Ваш список должен быть правильно настроен, если ваше приложение является одним из этих приложений.

...