Запуск службы фоновой передачи в фоновой выборке ios

Моя цель - отправить данные/изображение на сервер, когда приложение находится в фоновом режиме. В iOS7 мы можем сделать это, используя фоновую выборку. Но фоновая выборка предлагает только 30-секундный лимит времени. Данные, которые я отправляю на сервер, могут занять больше времени, так как в них больше изображений. Во время поиска в Google я наткнулся на службу фоновой передачи, которая предлагает неограниченное время для загрузки / выгрузки данных в фоновом режиме. Можно ли инициировать службу фоновой передачи в коде фоновой выборки? Если да, то как с этим справиться.


person Ronald Randon    schedule 14.08.2015    source источник
comment
Проверьте nsurlsession, он позволяет делегировать процесс загрузки на iOS, который позвонит вам при загрузке файла.   -  person user996142    schedule 17.10.2015


Ответы (1)


Всякий раз, когда вы хотите начать загрузку/выгрузку (в вашем случае в течение 30 секунд фоновой загрузки), выполните следующие строки:

        NSString *downloadURLString = //Your link here;
        NSURL* downloadURL = [NSURL URLWithString:downloadURLString];

        NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];


        // Create a background session
        static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *identifier = @"com.yourcompany.yourapp";
        NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];

        session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
    });


        //Init a NSURLSessionDownloadTask with the just-created request and resume it
        NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request];
        [task resume];

    });

Кроме того, не забудьте реализовать эти методы делегата:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                              didFinishDownloadingToURL:(NSURL *)location;

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                           didWriteData:(int64_t)bytesWritten
                                      totalBytesWritten:(int64_t)totalBytesWritten
                              totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;


- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                      didResumeAtOffset:(int64_t)fileOffset
                                     expectedTotalBytes:(int64_t)expectedTotalBytes;

Подробный пример см. в этом примере приложения.

person The Good Giant    schedule 14.12.2015