Как показать UILocalNotification, когда ASINetworkQueue завершает все запросы?

Я использую 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];
    }
}

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


person Felix    schedule 06.05.2011    source источник


Ответы (4)


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

person Daniel Dickison    schedule 06.05.2011
comment
Я знаю, что ASIHTTPRequest вызывает beginBackgroundTaskWithExpirationHandler, когда я настраиваю запрос с помощью [request setShouldContinueWhenAppEntersBackground:YES]. И загрузка файлов в фоновом режиме работает нормально, но я все еще не могу показать уведомление. - person Felix; 06.05.2011
comment
Не знал об этой функции ASIHTTPRequest. В таком случае, я не уверен, почему это не работает... - person Daniel Dickison; 06.05.2011

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

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

person visakh7    schedule 06.05.2011
comment
Извините, но этот ответ слишком общий и не решает мою конкретную проблему. Я знаю, как показывать локальные уведомления в целом. Я предполагаю, что причина, по которой метод делегата не вызывается в фоновом состоянии, заключается в том, что он вызывается с помощью performSelectorOnMainThread. - person Felix; 06.05.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];

Что ты делаешь:

  • Создайте локальное уведомление
  • Добавьте тело вашего LN
  • Добавьте название кнопки, которая появляется на «предупреждении».
  • Установите fireDate на фактическую дату и время (возможно, вам нужно увеличить фактическую дату на 1 или 2 секунды - для этого используйте: dateByAddingTimeInterval:)
  • Установите soundName (вы также можете использовать собственный звук...)
  • Запланировать/создать LN
person Fabio Poloni    schedule 06.05.2011
comment
Моя проблема не в том, как показать локальное уведомление. Настоящая проблема заключается в том, как вызвать queueFinished во время работы в фоновом режиме. - person Felix; 06.05.2011
comment
Как показать UILocalNotification...? Вот почему я написал по вашему вопросу. - person Fabio Poloni; 07.05.2011

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

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

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

person Fin    schedule 04.01.2012