24

Czy możliwe jest korzystanie z powiadomień push w systemie Geo na iOS, gdy aplikacja jest zabijana (nie w tle)?Jak korzystać z powiadomień push w oparciu o dane geograficzne w systemie iOS?

Jestem zainteresowany budowaniem aplikacji, w której użytkownik wybierze pozycję na mapie, a następnie, jeśli na przykład jest blisko tego obszaru, zostanie uruchomione lokalne powiadomienie push oparte na geolokalizacji.

Czy ten "pomysł" jest jednak możliwy? Czy GPS może działać i porównywać współrzędne, gdy aplikacja jest zabijana i uruchamiana, i powiadamia użytkownika, gdy jest na miejscu? Czy istnieje samouczek/artykuł/więcej informacji na temat, który mógłbym przeczytać?

Większość informacji, które czytałem w Internecie, przypomina bardziej ogólne koncepcje implementacji bez konkretnej informacji.

+0

Dlaczego nie chcesz, aby uruchomić aplikację w tle (czyli po zabiciu aplikacji)? Zastosowałem tę samą koncepcję w mojej aplikacji z funkcją działającą w tle. Czy możesz rozwinąć więcej. –

+0

na przykład. Powiedzmy, że użytkownik przypomina i chce to zobaczyć, kiedy idzie do swojego domu babci. To może być w przyszłym tygodniu. na pewno telefon mógł zostać zresetowany lub mógł usunąć aplikację z tła. Potrzebuję więc wyzwolenia wypychania, nawet gdy aplikacja nie działa w tle. Czy możesz podać nazwę aplikacji, która naprawdę mnie interesuje, aby zobaczyć, co zaimplementowałeś :) – donparalias

+0

1. GPS nie działa po zabiciu aplikacji, więc nie jest to możliwe. 2. Podczas komentowania przykładu, od strony CMS możesz ustawić powiadomienie push w czasie przypomnienia. W serwisie internetowym możesz zaprojektować algorytm taki, który wysyła powiadomienie push w ustawieniach za pomocą przypomnienia mobilnego. –

Odpowiedz

35

Dla śledzenia lokalizacji użytkownika, gdy aplikacja nie działa (tzn. Została wcześniej rozwiązana), istnieją dwie możliwości:

  1. Z iOS app programming guide pod „Śledzenie lokalizacji użytkownika”:

    Znacząca zmiana usługi lokalizacyjnej jest wysoce zalecana w przypadku aplikacji, które nie wymagają precyzyjnych danych o lokalizacji. Dzięki tej usłudze aktualizacje lokalizacji są generowane tylko wtedy, gdy lokalizacja użytkownika ulegnie znacznej zmianie; w ten sposób idealnie nadaje się do aplikacji społecznościowych lub aplikacji, które zapewniają użytkownikowi niekrytyczne informacje dotyczące lokalizacji. Jeśli aplikacja zostanie zawieszona po wystąpieniu aktualizacji, system budzi ją w tle, aby obsłużyć aktualizację. Jeśli aplikacja uruchomi tę usługę, a następnie zostanie zakończona, system ponownie uruchomi aplikację automatycznie, gdy nowa lokalizacja stanie się dostępna. Ta usługa jest dostępna w systemie iOS 4 i nowszych wersjach i jest dostępna tylko na urządzeniach z radiem komórkowym.

    Jednak według CLLocationManager class reference, to nie jest zbyt dokładny i aktualizacje są rzadkie:

    Uwaga: Aplikacje mogą spodziewać powiadomienie, gdy tylko urządzenie porusza się 500 metrów lub więcej od poprzedniego powiadomienia. Nie należy oczekiwać powiadomień częściej niż raz na pięć minut. Jeśli urządzenie jest w stanie pobrać dane z sieci, menedżer lokalizacji znacznie częściej dostarcza powiadomienia w odpowiednim czasie.

  2. Region Monitoring działa w podobny sposób - w tym ponowne uruchomienie aplikacji po jej rozwiązaniu - ale z większą dokładnością (w zależności od dostępności sieci WiFi i wież komórkowych):

    Konkretne odległości progowe są określane przez sprzęt i technologie lokalizacji, które są obecnie dostępne. Na przykład, jeśli Wi-Fi jest wyłączone, monitorowanie regionu jest znacznie mniej dokładne. Jednak do celów testowych można założyć, że minimalna odległość wynosi około 200 metrów.

    Inny region monitoring kwestią jest, że (zgodnie z CLLocationManager class reference) powiadomień wjazdowych i wyjazdowych w regionie może być przyjęta tylko 3-5 minut lub tak po przekroczeniu granic regionu.

    W zależności od aktualnych wymagań, monitorowanie regionu może zostać wykorzystane do uzyskania "szorstkiej" lokalizacji, a następnie, gdy użytkownik znajdzie się w określonym regionie, uruchom dokładniejszą usługę opartą na systemie GPS w menedżerze lokalizacji. Gdy użytkownik opuści region zainteresowania, wyłącz usługę GPS, aby zachować baterię i ponownie powróć do usługi monitorowania zgrubnego położenia (np. Monitorowanie regionu). Oto podstawowy realizacja:

    SomeViewController.m:

    ... 
    @interface SomeViewController() <CLLocationManagerDelegate> 
    
    @property (nonatomic, strong) CLLocationManager *locationManager; 
    @property (nonatomic, strong) CLRegion *someRegion; 
    
    @end 
    
    @implementation SomeViewController 
    
    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
    
        self.locationManager = [[CLLocationManager alloc] init]; 
    
        CLLocationDistance radius = 10; // 10 metre sensitivity 
        self.someRegion = [[CLRegion alloc] initCircularRegionWithCenter:someCoordinates radius:radius identifier:@"Smithtown Dry Cleaners"]; 
    
        self.locationManager.delegate = self; 
        [self.locationManager startMonitoringForRegion:self.someRegion]; 
    
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
        self.locationManager.distanceFilter = 10; 
        [self.locationManager startUpdatingLocation]; 
    } 
    
    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
    { 
        [self.locationManager startUpdatingLocation]; 
    } 
    
    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
    { 
        [self.locationManager stopUpdatingLocation]; 
    } 
    
    // Delegate method from the CLLocationManagerDelegate protocol. 
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
    { 
        CLLocation* location = [locations lastObject]; 
    
        // If the user's current location is not within the region anymore, stop updating 
        if ([self.someRegion containsCoordinate:location.coordinate] == NO) { 
         [self.locationManager stopUpdatingLocation]; 
        } 
    
        NSString *locationData = [NSString stringWithFormat:@"latitude %+.6f, longitude %+.6f\n", 
               location.coordinate.latitude, 
               location.coordinate.longitude]; 
        NSLog(@"%@", locationData); 
    
        UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
        localNotification.alertBody = locationData; 
        localNotification.alertAction = @"Location data received"; 
        localNotification.hasAction = YES; 
        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; 
    } 
    

    Pamiętaj, aby dodać odpowiednie wpisy do pliku plist aplikacji więc aplikacja będzie działać w tle dostęp do odpowiednich zasobów:

    MojaApl-Info.plist:

    <key>UIBackgroundModes</key> 
    <array> 
         ... 
         <string>location</string> 
    </array> 
    <key>UIRequiredDeviceCapabilities</key> 
    <array> 
         ... 
         <string>location-services</string> 
         <string>gps</string> 
    </array> 
    

    Powyższy kod zakłada wykorzystanie iOS6 i ARC

+0

Tak na pewno wygląda! Czy masz jakieś pojęcie, ale jaką dokładność mówimy w tym przypadku? Ponieważ widziałem niektóre aplikacje (nie ściągałem ich, ponieważ były drogie), które wspierałyby geo-push, ale z dokładnością około 500m obszaru. To byłoby zbyt wiele dla mojego celu. Nie wiem, czy mógłbyś wybrać precyzję około 50-100m i ile baterii kosztowałoby to cały czas. Patrzę teraz na to w większym stopniu. – donparalias

+0

Ponieważ istotna zmiana usługi lokalizacyjnej zależy od urządzenia zmieniającego wieże komórek, może to nie być wystarczająco dobre. – gavdotnet

+0

Powinna jednak istnieć możliwość odsłuchania powiadomienia o "znaczącej zmianie", które pobudzi aplikację (jeśli została zakończona), a następnie rozpocznie korzystanie ze standardowych usług lokalizacyjnych w tle - co zapewnia lepszą dokładność - do momentu ponownego zakończenia aplikacji. Będziesz oczywiście tracić pewną dokładność, gdy aplikacja nie działa, ale przez resztę czasu będzie tak dokładna, jak każda aplikacja w tle. – gavdotnet

Powiązane problemy