2013-10-16 10 views
12

Mam bardzo prosty przykład aplikacji, która inicjuje i aktualizuje lokalizację użytkownika. Na urządzeniu pomyślnie rzuca kolejną lokalizację wywołania zwrotnego co sekundę jednak na urządzeniu (iPhone z systemem iOS7) jest wywoływana metodą raz i następnie zatrzymuje się tajemniczo ...iOS7 Core Lokalizacja nie aktualizuje się

//Setup Location Manager in ViewDidLoad 
locationManager = [[CLLocationManager alloc] init]; 
[locationManager setDistanceFilter:kCLDistanceFilterNone]; 
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locationManager setDelegate:self]; 
[locationManager startUpdatingLocation]; 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"location services not turned on"); 
} 

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    NSLog(@"loactions %@", locations); 
} 

-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 

    NSLog(@"new location %f, and old %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 
} 

W iOS6 ta aplikacja działa doskonale i stale aktualizowana lokalizację urządzeń ... Co się zmieniło od iOS7?

+0

Metoda didUpdateLocations uruchamia się, czy nie? – karthika

+0

jego wyzwalanie, ale tylko raz ... –

+0

Czy w tej metodzie wywołujesz metodę stopUpdatingLocation? – karthika

Odpowiedz

12

Istnieje kilka rzeczy tutaj:

1- nie widzę nigdzie właściwość: pausesLocationUpdatesAutomatically. Wartością domyślną dla tej właściwości jest Tak. Oznacza to, że w zależności od parametru activityType (patrz # 2), GPS wstrzyma aktualizacje i może to być przyczyną braku aktualizacji. Algorytm to czarna skrzynka, którą zna tylko Apple, a może w jakiś sposób zmieniła się między iOS6 i iOS7. Ustawienie pauzyLocationUpdatesAutomatycznie na NIE może wpływać na baterię.

2- Należy ustawić właściwość activityType w zależności od aplikacji. Wartością domyślną jest CLActivityTypeInne, które nie jestem pewien, jak wpływa to na algorytm GPS i nr 1 powyżej. Aby najpierw przetestować twoją aplikację, ustawiłbym właściwość activityType odpowiednio i zmienił pauzyLocationUpdatesAutomatycznie na Nie. W moim teście otrzymywałbym aktualizację co sekundę konsekwentnie (testowałem ją przez noc).

3- Testowanie aktualizacji lokalizacji wymaga ruchu. Aby uzyskać lepsze wyniki, użyłbym parametru activityType, który ustawiłeś, do testowania. Innymi słowy, jeśli parametr activityType ma wartość CLActivityTypeFitness, chodziłbym, aby go przetestować, itp.

4 locationManager didUpdateToLocation fromLocation jest przestarzałe w iOS7. Ponadto jeśli zaimplementowano locationManager didUpdateLocations, ten pierwszy nie zostanie wywołany. Tak więc w powyższym przypadku obiekt LocationManager nie zrobił wywołaniaUupdateToLocation zLocation.

5- Nie ma rzeczywistej różnicy w zużyciu baterii między kCLLocationAccuracyBestForNavigation a kCLLocationAccuracyBest. Z drugiej strony, kCLLocationAccuracyBestForNavigation wykorzystuje GPS o najwyższej prędkości, a ponadto łączy go z danymi z akcelerometru.

Więc zacznę od ustawienia activityType, ustawia pauzęLocationUpdatesAutomatycznie na NIE i zmieniając pożądanąCzasowość na kCLLocationAccuracyBestForNavigation. Gdy otrzymujesz ciągłe aktualizacje, ustawię pauzyLocationUpdatesAutomatycznie na Tak i spróbuję pracować z kodem, aby osiągnąć tę samą użyteczność aplikacji.

Mam nadzieję, że to pomaga

+0

Co się stanie, jeśli umieści moją aplikację w tle, podejdę do POINT A, a następnie zatrzymam się na 20 minut. Potem znów ruszam do POINT B.Przez cały ten czas aplikacja jest nadal w tle. Kiedy otworzę moją aplikację z powrotem w trybie pierwszoplanowym, czy funkcja UPDateLocations da mi wszystkie lokalizacje między POINT A a POINT B? –

+0

Nie, nie, lokalizacja odebrana przez układ GPS zostanie przekazana bezpośrednio za pomocą metody locationManager: didUpdateLocations. Więc jeśli chcesz zapisać ścieżkę lokalizacji, będziesz musiał przechowywać je bezpośrednio po ich otrzymaniu. – Leon

Powiązane problemy