2015-06-19 3 views
0

Я хочу запустить некоторый запрос, пока мое приложение находится в фоновом режиме. Мое приложение поддерживает фоновый режим -> выбор фона.Запуск запроса в фоновом режиме IOS

Но ниже код всегда возвращается сбой, пока мое приложение находится в фоновом режиме! Есть ли способ запустить запрос? Я также пробовал NSURLConnection, он иногда получает ответ, иногда не получает ответа!

[[AFHTTPRequestOperationManager manager]POST:@"http://app.xxxx.com/message_delivery.php" parameters:@{@"message_id":MsgID} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 


    } success:^(AFHTTPRequestOperation *operation, id response) { 
     NSLog(@"succesfuly tik"); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"%@",error); 
    }]; 

Эти код иногда работает иногда не

NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://app.xxxx.com/message_delivery.php?message_id=%@",MsgID]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:2]; 
    [[[NSURLConnection alloc] initWithRequest:request delegate:self]start]; 
+0

BTW при использовании 'NSURLConnection' не использует' start' в сочетании с 'initWithRequest: delegate:'. Это уже начинает для вас. Используйте только метод 'start', если вы используете' initWithRequest: delegate: startImmediately: 'с' NO'/'FALSE' для этого последнего параметра. – Rob

ответ

2

Фоновая выборка очень специфическая технология, которая позволяет ОС оппортунистически назвать код, который, в свою очередь, вызывает ваш веб-сервис, чтобы увидеть, если есть какие-либо новые данные для извлечения. Но у вас мало времени для выполнения этого запроса (30 секунд?). Он не предназначен для чего-либо существенного (или, если это так, вы женитесь на фоновом изображении с фоном NSURLSession, совершенно другой технологией). И когда фоновая выборка делает один из этих оппортунистических вызовов, вы вызываете обработчик завершения, когда вы закончите.

Но ваши два примера кода не показывают нам, что вы вызываете обработчик завершения, переданный вам делегатом приложения performFetchWithCompletionHandler. Поэтому я не понимаю, действительно ли вы делаете фоновый выбор и не делили соответствующий код, или вы объединяете разные технологии.

Существует три основных подхода к фоновой сети, каждый из которых имеет свои плюсы и минусы.

  • Есть фоновый выбор, где ОС будет инициировать оппортунистический сетевой запрос в момент его собственного выбора;

  • beginBackgroundTaskWithExpirationHandler, который позволяет вашему приложению продолжать работать в течение нескольких минут (в настоящее время 3 минуты), чтобы завершить задачи с конечной длиной ... это полезно, если вы начинаете сетевой запрос, который, как вы знаете, может занять на несколько минут, и вы не хотите, чтобы он умер только потому, что пользователь оставил ваше приложение; и

  • Существует NSURLSession с фоном NSURLSessionConfiguration, в котором демон IOS выполняет запросы от имени вашего приложения и позволяет вам загружать и выгружать запросы, которые могут занять гораздо больше времени (даже после того, как приложение было прекращено), пробуждение вашего приложения, когда оно будет сделано.

Непонятно мне, на основе вашего описания, какие из них применимы в вашем случае. Когда вы говорите, что ваши запросы запущены в фоновом режиме, насколько точно инициируются запросы и как долго они будут проходить, наихудший сценарий?

Сказав это, при создании фоновой сети я бы рассмотрел переход на NSURLSession, что открывает дополнительные возможности. С AFNetworking это достигается с помощью AFHTTPSessionManager (а не AFHTTPRequestOperationManager; это немного сложно, но см. https://stackoverflow.com/a/21359684/1271826 для обсуждения настройки AFNetworking для фоновых сеансов). Если вы делаете это самостоятельно, то используйте NSURLSession с фоном NSURLSessionConfiguration, а не с помощью NSURLConnection.

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