5

У меня есть приложение, которое отправляет данные на сервер, пока приложение находится в фоновом режиме. Вот код отвечает за отправки данных:Данные не отправляются с фона через 3G

-(bool) sendStats: (MCStatsSender*) val{ 

    if(![self checkInternet]){ //Using Reachability here 

     return false; 
    } 

    NSDictionary *inputData = [NSDictionary dictionaryWithObjectsAndKeys: 
           self.propertyA.value, "key1", 
           val.data, "key2", 
           nil]; 


    [myNetworkManager doRequest:[myRequestManager createWithStringAndDictionary:MY_URL Data:inputData handler:myHandler user:val]]; 
    return true; 
} 

Так inputData простой словарь со строками.

Метод doRequest основан на NSURLSession и в основном выглядит следующим образом:

-(void) doRequest: (MCRequest*) request{ 

    [tasks addObject:request]; 

    if(m_session == nil){ 
     NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"key-%lu",reqid]]; 
     m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
    } 

    NSURLSessionDataTask* task = [m_session dataTaskWithRequest:request.generatedRequest]; 
    request.reqId = task.taskIdentifier; 
    [task resume]; 
} 

Как я уже говорил, все работает через Wi-Fi, приложение переходит в фоновом режиме, и через несколько минут, пользовательское устройство bluetooth отправляет некоторые данные и пробуждает приложение из приостановленного режима. После того, как данные были получены приложением iOS, он не может отправить его на сервер, если устройство подключено через 3G. Я уверен, что данные, отправленные через Bluetooth, получены, потому что они хранятся в локальной базе данных.

Также есть еще один важный факт. Если приложение запускается через Xcode, даже если устройство подключено через 3G, приложение отправит данные из фона. Чтобы сделать это, я запустил приложение, а затем нажмите кнопку «Домой», чтобы поместить его в фон.

Не знаете, в чем разница и почему приложение действует по-разному, когда оно подключено кабелем к Mac и почему данные не отправляются через 3G (или даже 2G)?

Дополнительная информация:

Я не пытаюсь загрузить файл, а просто отправить JSON на сервер.

+0

после того, сколько времени вы получили данные Bluetooth на своем устройстве? – CodeChanger

+0

@CodeChanger Приложение получает данные от Bluetooth каждые пять минут или меньше. Я уверен, что данные из bluetooth получены, потому что я храню его в локальной базе данных sqlite. – Whirlwind

+0

Хорошо, так как по моим знаниям после 3.0 Min приложение приостановлено, и вам нужно обработать этот режим и вызвать службу с помощью 'bgTask'. – CodeChanger

ответ

4

Похоже, что это касается использования энергии. Фоновая загрузка, предлагаемая сеансом URL-адреса, удобна, и она предлагается вам при диспропорции ОС - она ​​предлагает отправлять данные, но она выбирает, когда.

Вещи, которые влияют на отправку данных, включают в себя подключение устройства к питанию, качество подключения к данным (сколько времени и сколько энергии потребуется для отправки данных), что еще делает устройство (может ли он объединить несколько загрузок) ...

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

Этот тип тестирования действительно должен выполняться только на устройстве и не связан с Xcode, поскольку он влияет на тест. Вместо этого используйте что-то вроде прокси-сервера Charles, чтобы регистрировать сетевые запросы и использовать устройство, оставляя его на время и, возможно, открывая и используя другое приложение. Вы должны увидеть, что данные будут отправлены в конце концов, но вам придется подождать.

+0

Да, я сделал еще несколько исследований и копал об этом, и речь идет о мощности и Wi-Fi в основном, которые являются двумя основными факторами, когда iOS определяет, находится ли приложение в хорошем состоянии для выполнения дискреционных задач. Конечно, есть и другие факторы, как вы сказали ... – Whirlwind

+0

Тем не менее, проблема в том, что данные не отправляются, если приложение находится в фоновом режиме, а не через 1 минуту, а не через 1 час. Дело в том, что я не тот, кто написал класс, который обрабатывает запросы, поэтому я не могу быть на 100% уверен, что на данный момент все настроено правильно (надеюсь, что сам класс проблематичен).Я сделаю несколько тестов и дам вам информацию о результатах. Я тестировал устройство, подключенное к компьютеру, чтобы проверить, есть ли у батареи что-то с этим. Конечно, я отключу устройство позже. – Whirlwind

+0

Я просто попробовал прокси-сервер Charles для удовольствия, это удобное приложение, но это не так полезно в моем случае. Потому что для этого требуется соединение Wi-Fi. Мои сетевые запросы отправляются (как я уже упоминал в моем вопросе), когда устройство подключено через Wi-Fi. Проблема связана с сотовой (3G) связью. В любом случае, мне действительно не нужно это приложение, потому что я уже вижу на своем сервере, если запрос был успешным или нет. Я думаю, что немного экспериментирую с NSURLSession, его конфигурацией и фоновыми задачами. – Whirlwind