2016-11-08 32 views
5

Mam aplikację, która wysyła dane do serwera, gdy aplikacja jest w tle. Oto kod odpowiedzialny za wysyłanie danych:Dane nie wysłane z tła za pośrednictwem 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; 
} 

Więc inputData jest prosty słownik z łańcuchów.

Sposób doRequest opiera się na NSURLSession i zasadniczo wygląda następująco:

-(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]; 
} 

Jak powiedziałem, wszystko działa za pośrednictwem Wi-Fi, aplikacja przechodzi w tle, a po kilku minutach niestandardowe urządzenie Bluetooth wysyła pewne dane i uruchamia aplikację z trybu zawieszonego. Po otrzymaniu danych przez aplikację iOS, nie uda się wysłać jej do serwera, jeśli urządzenie jest połączone przez 3G. Jestem przekonany, że dane wysyłane przez bluetooth są odbierane, ponieważ są przechowywane w lokalnej bazie danych.

Jest jeszcze jeden ważny fakt. Jeśli aplikacja jest uruchamiana przez Xcode, nawet jeśli urządzenie jest połączone przez 3G, aplikacja wyśle ​​dane z tła. Aby to zrobić, uruchamiam aplikację, a następnie stukam przycisk strony głównej, aby umieścić ją w tle.

Nie wiem, jaka jest różnica i dlaczego aplikacja działa inaczej, gdy jest podłączona za pomocą kabla do komputera Mac i dlaczego dane nie są przesyłane przez sieć 3G (lub nawet 2G)?

Dodatkowe informacje:

Nie próbuję załadować plik, ale raczej po prostu wysłać JSON do serwera.

+0

po tym, ile czasu masz danych bluetooth w urządzeniu? – CodeChanger

+0

@CodeChanger Aplikacja pobiera dane z bluetooth co pięć minut lub mniej. Jestem pewien, że dane z bluetooth są odbierane, ponieważ przechowuję je w lokalnej bazie danych SQLite. – Whirlwind

+0

OK, zgodnie z moją wiedzą po zawieszeniu aplikacji 3.0 Min i musisz obsłużyć ten tryb i zadzwonić do swojej usługi za pomocą 'bgTask'. – CodeChanger

Odpowiedz

4

Wydaje się prawdopodobne, że chodzi o zużycie energii. Przesyłanie w tle oferowane przez sesję URL jest wygodą i jest oferowane w momencie zamknięcia systemu operacyjnego - oferuje wysyłanie danych, ale może wybrać, kiedy.

Rzeczy, które mają wpływ na wysyłane dane, obejmują: podłączenie urządzenia do zasilania, jakość połączenia danych (jak długo i ile energii potrzeba na przesłanie danych), co jeszcze robi urządzenie (może łączyć wiele przesłanych plików) ...

Nie można więc zgadywać ani polegać na żadnym zadaniu, które ma być wykonywane w określonym czasie, gdy znajduje się w tle.

Ten rodzaj testowania powinien być przeprowadzany tylko na urządzeniu i nie może być podłączony do Xcode, ponieważ ma wpływ na test. Zamiast tego użyj czegoś takiego jak proxy Charlesa, aby logować żądania sieciowe i korzystać z urządzenia, pozostawiając je na pewien czas i być może otwierając i korzystając z innej aplikacji. Powinieneś zobaczyć, że dane zostaną ostatecznie wysłane, ale będziesz musiał poczekać.

+0

Tak, zrobiłem więcej badań i kopałem na ten temat, a chodzi głównie o moc i Wi-Fi, które są dwoma głównymi czynnikami, gdy iOS określa, czy aplikacja jest w dobrym stanie do wykonywania zadań uznaniowych. Oczywiście, są też inne czynniki, jak powiedziałeś ... – Whirlwind

+0

Problem polega na tym, że żadne dane nie są wysyłane, jeśli aplikacja jest w tle, a nie po 1 minucie, a nie po 1 godzinie. Chodzi o to, że nie jestem tym, który napisał klasę, która obsługuje żądania, więc nie mogę być w 100% pewien, że wszystko jest poprawnie skonfigurowane (mam nadzieję, że sama klasa jest problematyczna).Zrobię kilka testów i dam ci znać o wynikach. Testowałem na urządzeniu podłączonym do komputera, aby sprawdzić, czy bateria ma coś z tym. Oczywiście później odłączę urządzenie. – Whirlwind

+0

Po prostu próbowałem proxy Charlesa dla zabawy, jest to przydatna aplikacja, ale nie jest to pomocne w moim przypadku. Ponieważ wymaga połączenia Wi-Fi. Moje żądania sieciowe są wysyłane (jak wspomniałem w moim pytaniu), gdy urządzenie jest połączone przez Wi-Fi. Problem dotyczy połączenia z siecią komórkową (3G). Tak czy inaczej, właściwie nie potrzebuję tej aplikacji, ponieważ widzę już na moim serwerze, jeśli prośba się powiodła. Myślę, że trochę poeksperymentuję z NSURLSession, jego konfiguracją i zadaniami tła. – Whirlwind