handleEventsForBackgroundURLSession никогда не вызывается после завершения задачи загрузки

Я использую AFURLSessionManager и устанавливаю менеджер как одноэлементный экземпляр.

- (AFURLSessionManager *)backgroundSession
{
    static AFURLSessionManager *backgroundSession = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.testBackground.BackgroundDownload.BackgroundSession1234"];
    backgroundSession = [[AFURLSessionManager alloc]initWithSessionConfiguration:config];
    [backgroundSession setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite){
        NSLog(@"i am downloading my id = %d progress= %f",downloadTask.taskIdentifier, totalBytesWritten*1.0/totalBytesExpectedToWrite);
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    }];
    [backgroundSession setDownloadTaskDidFinishDownloadingBlock:^NSURL *(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location){
        NSLog(@"download finished");
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        return location;

    }];
    });
    return backgroundSession;
}
//assign a download task
NSURLSessionDownloadTask *task = [manager1 downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        return targetPath;
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog("%download success");
}];
[task resume];

Я обнаружил, что когда я переключаю приложение в фоновый режим, задача загрузки выполняется, но когда она была завершена, системный вызов handleEventsForBackgroundURLSession никогда не будет вызываться. Я чувствую, что пропустил некоторые настройки или параметры. Любая идея будет полезна для меня, большое спасибо.

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler;

person snorlax    schedule 05.12.2013    source источник


Ответы (2)


Вы, вероятно, уже поняли это, но в любом случае, то же самое произошло со мной, когда я писал тестовый код для работы с API службы фоновой передачи (без AFNetworking). Решение состояло в том, чтобы просто изменить строку идентификатора для моей конфигурации фонового сеанса. Каким-то образом тот, который я использовал, заглючил, и система не запускала обратный вызов handleEventsForBackgroundURLSession. И даже не перезагружая устройство, это не исправляет... а просто смена идентификатора.

Моя теория заключается в том, что мой код создал несколько экземпляров NSURLSession с одной и той же конфигурацией, против чего Apple явно не советует (в документации говорится, что если вы это сделаете, у него будет неопределенное поведение). Я получал NSURLSessionConfiguration в методе viewDidLoad контроллера представления без блока dispatch_once, поэтому вполне вероятно, что это произошло.

person Oscar Hierro    schedule 11.12.2013

Как заявляет Apple:

Если приложение iOS завершается системой и перезапускается, приложение может использовать тот же идентификатор для создания нового объекта конфигурации и сеанса и получения статуса передачи, которая выполнялась на момент завершения. Это поведение применимо только для нормального завершения приложения системой. Если пользователь завершает работу приложения с экрана многозадачности, система отменяет все фоновые передачи сеанса. Кроме того, система не перезапускает автоматически приложения, которые были принудительно закрыты пользователем. Пользователь должен явным образом перезапустить приложение, прежде чем передача может начаться снова.

Надеюсь, поможет. Стефан

person blackjacx    schedule 14.11.2014
comment
Помог мне отладить, когда я был вынужден закрыть свое приложение, чтобы увидеть, будет ли вызываться handleEventsForBackgroundURLSession. Очевидно, теперь я знаю, что этого не будет. Ваше здоровье - person bandejapaisa; 02.01.2015