2013-12-05 5 views
9

Я использую AFURLSessionManager и задаю диспетчер как экземпляр singleton.handleEventsForBackgroundURLSession никогда не вызывается, когда загрузка завершена.

- (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 системного вызова не будет called.I чуствует, что я пропустил некоторые настройки или опцию. Любая идея будет полезна для меня, спасибо большое.

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

ответ

5

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

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

6

Как заявил Apple:

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

Надеюсь, это поможет. Stefan

+0

Помог мне отладить, когда я был вынужден покинуть свое приложение, чтобы увидеть, будет ли вызвана handleEventsForBackgroundURLSession. Очевидно, теперь я знаю, что это не так. ура – bandejapaisa

Смежные вопросы