1

Мое приложение получить беззвучный толчок, а затем сделать некоторые запрос HTTP в фоновом режиме, используя AFNetworking, но он не вошел в полный блок, код:AFHTTPSessionManager блок не вызывается, когда приложение находится на фоне

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
[manager GET:urlString 
    parameters:nil 
    success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"response objece:%@", responseObject); 
    } 
    failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSLog(@"error:%@", error); 
    }]; 

то я нашел, возможно, я мог бы использовать NSURLSessionConfiguration в конфиг сессии:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.company.backgroundDownloadSession"]; 
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration]; 
[manager GET:urlString 
    parameters:nil 
    success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"response objece:%@", responseObject); 
    } 
    failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSLog(@"error:%@", error); 
    }]; 

но AFNetworking аварии говорит: "Нагрузочное приложение из-за неперехваченное исключение„NSGenericException“, причина:" задачи данных не поддерживаются в фоновом режиме сессий. Что мне делать? И я ценю вашу помощь!

ответ

2

Пара мыслей:

  1. Правильный фон NSURLSessionConfiguration требует NSURLSessionDownloadTask или NSURLSessionUploadTask. Метод GET, тем не менее, создает NSURLSessionDataTask.

    Чтобы использовать задачи загрузки или выгрузки, вам нужно будет создать свой запрос отдельно, а затем использовать AFURLSessionManager для загрузки или выгрузки. Сказав это, вы можете создавать запросы с использованием различных сериализаторов запросов, если вы пытаетесь создать HTTP-запросы HTTP GET/POST. Просто используйте метод AFHTTPRequestSerializerrequestWithMethod.

    Для ознакомления с использованием AFNetworking в сочетании с фоном NSURLSessionConfiguration см. https://stackoverflow.com/a/21359684/1271826. Вам придется жениться на этом с requestWithMethod, обсужденным выше.

    Обратите внимание, что будьте осторожны с использованием блоков завершения задачи (поскольку задачи продолжаются, даже если приложение завершено, и эти блоки давно прошли). Поскольку документация AFNetworking для задач фона загрузки говорит:

    Предупреждение: При использовании фона NSURLSessionConfiguration на прошивке, эти блоки будут потеряны, когда приложение завершаются. Фоновые сеансы могут предпочесть использовать setDownloadTaskDidFinishDownloadingBlock: для указания URL-адреса для сохранения загруженного файла, а не целевого блока этого метода.

  2. Если вы делаете скромный запрос, он может быть проще просто попросить OS на некоторое время, чтобы сделать это, если пользователь происходит оставить приложение, пока запрос еще не завершен. См. Выполнение задач конечной длины раздел App Programming Guide for iOS: Background Execution.

    Нижняя линия, перед выдачей запроса, сделать что-то вроде:

    UIApplication *application = [UIApplication sharedApplication]; 
    
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{ 
        // Clean up any unfinished task business by marking where you 
        // stopped or ending the task outright. 
        [application endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
    }]; 
    

    А потом в завершение блок запроса, вы можете завершить фоновую задачу:

    if (bgTask != UIBackgroundTaskInvalid) { 
        [application endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
    } 
    

    Это только хорошо для задач конечной длины, но это, вероятно, намного проще, чем пытаться сделать фоном NSURLSessionConfiguration.

+0

Это всего лишь несколько запросов http, поэтому второе предложение - именно то, что я хочу, спасибо, вы - спасатель жизни! – John

+0

@rob, когда приложение завершено, и я хочу подключить пользователя и получить онлайн-пользователя на сервере XMPP, чем Как я могу подключиться? – Raju

+0

Если вы хотите выполнять запросы, пока приложение не запущено, единственный способ сделать это - выборка фона. См. [Загрузка содержимого в фоновом режиме] (https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW5) в Руководстве по программированию _App для iOS._ Примечание. У вас нет контроля над тем, когда вызывается сервер, но у вас есть этот механизм для загрузки данных в фоновом режиме. – Rob

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