iOS: NSURLSession не работает каждый раз, когда запускается в фоновом режиме (с тихим push-уведомлением) - PullRequest
0 голосов
/ 05 июня 2018

Если я вызываю NSURLSession, когда приложение находится в фоновом режиме с push-уведомлением, ответ может быть получен только один раз в три.

 NSLog(@"SEND: LAUNCH FUNCTION!!!!");
    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:[NSURL URLWithString:url_string]
            completionHandler:^(NSData *data,
                                NSURLResponse *response,
                                NSError *error) {
                // handle response
if (error == nil) {
        NSLog(@"SEND: RESPONSE FUNCTION GOOD!!!!");
        NSMutableArray* responseArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self parseAndAddLovAll:responseArray toArray:self.objects];
        });
    }
    else
    {
        NSLog(@"SEND: RESPONSE FUNCTION BAD!!!!");
    }
            }] resume];

(Если я вызываю NSURLSession, когда приложениеактивен, никаких проблем, он работает каждый раз).

РЕДАКТИРОВАТЬ:

Мы можем видеть в этом видео, что когда я нажимаю 1ST время, он запускает NSURLSession,без ответа.Если щелкнуть время 2ND , появится ответ 1ST , за которым следует ответ 2ND .

*SEND: LAUNCH FUNCTION!!!!* =>** launch the NSURLSession.  
*SEND: RESPONSE FUNCTION GOOD!!!!*** => Response ok from the NSURLSession.  
*SEND: RESPONSE FUNCTION BAD!!!!*** => Response not ok from the NSURLSession.  
*SEND: FINISHED!!!!*** => Download execution finished with success. 

Я вставил демо в видео:

Видео

РЕДАКТИРОВАТЬ:

Call of the function:  
      dispatch_queue_t downloadQueue = dispatch_queue_create("downloader", NULL);
      dispatch_async(downloadQueue, ^{
                  ListOfValueSync * lovSync = [[ListOfValueSync alloc] init];

            // Synchronization
            BOOL ret = [lovSync getAllListOfValueAll];
            });

Что может вызвать эту проблему?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я думаю, что у вас есть проблемы с вызовом функции.Вы не можете использовать свою очередь загрузки в этом случае.

Вместо этого используйте dispatch_main

0 голосов
/ 05 июня 2018

Чтобы начать загрузку, когда приложение находится в фоновом режиме, согласно Apple Doc

Для поддержки этого фонового режима включите параметр «Удаленные уведомления» в разделе «Фоновые режимы» на вкладке «Возможности».в вашем проекте XCode.(Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением удаленного уведомления в файле Info.plist вашего приложения.)

Для push-уведомления, запускающего операцию загрузки,Полезная нагрузка уведомления должна включать ключ content-available со значением, установленным в 1. Когда этот ключ присутствует, система запускает приложение в фоновом режиме (или запускает его в фоновом режиме) и вызывает делегат приложения application:didReceiveRemoteNotification:fetchCompletionHandler: метод.Ваша реализация этого метода должна загрузить соответствующий контент и интегрировать его в ваше приложение.

Помнить при использовании Фоновое выполнение

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

...