2012-10-17 20 views
5

jestem wdrażaniu aplikacji gdzie muszę śledzić lokalizację użytkownika brzmienie: lokalizacji użytkownikauzyskać dokładne współrzędne z didExitRegion

  • toru, podczas gdy aplikacja jest w tle lub zamknięte
  • jeśli Użytkownika lokalizacja została zmieniona na około 2000 metrów i powinien wykonać wywołanie API.

moje podejście do tego problemu jest następujące:

  • po raz pierwszy użytkownik uruchamia aplikację i rozpocząć monitorowanie dla regionu używając swojego aktualnego położenia
  • jeśli didExitRegion jest wyzwalany, wykonuję wywołanie API i zastępuję bieżący monitorowany region nowym regionem, używając bieżącej lokalizacji jako centrum nowego regionu.

działa to dobrze, gdy aplikacja jest na pierwszym planie, ponieważ lokalizacja zwrócona przez menedżera lokalizacji jest dokładna.

Ale jeśli aplikacja jest w tle, menedżer lokalizacji nie zwróci dokładnej lokalizacji, ponieważ jest ona uruchomiona po raz pierwszy, a pierwsze zwrócone współrzędne nie są dokładne.

Pytanie brzmi, w jaki sposób mogę uzyskać dokładną lokalizację użytkownika po uruchomieniu didExitRegion w tle?

dzięki

+0

Co z prośbą do menedżera lokalizacji o zaktualizowanie bieżących współrzędnych i ich użycie? – ilmiacs

+0

to właśnie robię teraz, ale nie daje dokładnej lokalizacji. Zastanawiam się, czy istnieje sposób na uzyskanie najdokładniejszej lokalizacji od menedżera lokalizacji. – Kassem

+0

Prawdopodobnie system zmienia pożądaną dokładność, gdy aplikacje działają w tle? – ilmiacs

Odpowiedz

3

nie miałem dużo szczęścia z didExitRegion: wypalania niezawodnie; często strzela znacznie dalej niż na skraju mojego regionu.

Proponuję użyć CLLocationManager 's -startMonitoringSignificantLocationChanges, jeśli potrzebujesz tylko połączenia API co 2 km. Jeśli twoja dokładność/precyzja jest ważna, po prostu zarejestruj usługi lokalizacyjne jako niezbędny stan tła (UIBackgroundModes w Twoim pli app app, być może będziesz musiał to zrobić, aby użyć znaczącej zmiany API również z tła) i użyć zwykłego -startUpdatingLocation, z odpowiednie wartości pól w instancji CLLocationManager.

+0

-startMonitoringSignificantLocationChanges nie jest dokładna i czasami uruchamia się co 8 KM. obecnie używam innego sposobu, o którym wspomniałeś, ale tak bardzo wyczerpuje baterię. – Kassem

0

Kilka rzeczy tutaj się dzieje.

Wspomniał Pan, że wyzwalacz zmiany regionu jest małą zmienną. To jest celowe; Aby uniknąć dużej liczby wyzwalaczy wystrzeliwanych w miarę przesuwania się granicy pomiędzy dwoma regionami, istnieje pewna przyczepność do wyzwalania, zarówno w czasie, jak i pozycji.

Z dokumentacji (http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1)

The system does not report boundary crossings until the boundary plus a designated cushion distance is exceeded. You specify the desired cushion distance for a region when you register it using the startMonitoringForRegion:desiredAccuracy: method. This cushion value prevents the system from generating numerous entered and exited events in quick succession while the user is traveling close the edge of the boundary. 

uzyskanie dokładnej pozycji nie różni się od normalnego. Uruchamiasz menedżera lokalizacji i czekasz, aż otrzymasz aktualizację lokalizacji z pożądaną dokładnością. Zamknij menedżera i użyj pozycji.

Ponieważ pracujesz w tle, masz tylko dziesięć minut, aby to zrobić, i musisz powiedzieć systemowi operacyjnemu, że przetwarzasz dane w tle za pomocą instrukcji startBackgroundTaskWithExceptionHandler UIApplication. Mnóstwo dokumentacji na ten temat gdzie indziej.

Nadzieję, że pomaga.

Powiązane problemy