24

È possibile utilizzare le notifiche push basate su geo su iOS quando l'applicazione viene uccisa (non in background)?Come utilizzare le notifiche push basate su geo su iOS?

Sono interessato a creare un'app, in cui l'utente sceglierà una posizione su una mappa, e quindi se lui/lei per esempio è vicino a quell'area verrà attivata una notifica push locale basata su geo.

Tuttavia questa "idea" è possibile? Il GPS può funzionare e confrontare le coordinate quando l'app viene uccisa ed eseguita e avvisare l'utente quando è installato? C'è un tutorial/articolo/ulteriori informazioni di qualsiasi tipo sull'argomento che potrei leggere?

La maggior parte delle informazioni che ho letto online erano più come idee generali di implementazione senza nulla di specifico sull'argomento.

+0

Perché non si desidera eseguire l'applicazione in background (significa dopo aver ucciso app)? Ho applicato lo stesso concetto nella mia app con la funzione di esecuzione in background. Puoi elaborare di più. –

+0

per esempio. Diciamo che l'utente fa un promemoria e vuole vederlo quando va nella sua casa di Natale. Potrebbe essere la prossima settimana. sicuramente il telefono potrebbe essere resettato o potrebbe aver cancellato l'app dallo sfondo. Quindi ho bisogno che la spinta venga sospesa anche quando l'app non è in esecuzione in background. Puoi dirmi il nome dell'app mi interessa davvero vedere cosa hai implementato :) – donparalias

+0

1. Il GPS non funziona quando l'applicazione viene uccisa, quindi non è possibile. 2. Mentre si commenta un esempio, dal lato CMS è possibile impostare la notifica push sull'ora del promemoria. Sul servizio web è possibile progettare un algoritmo tale che invii notifiche push come si imposta tramite promemoria mobile. –

risposta

35

Per tracciare la posizione dell'utente mentre l'applicazione non è in esecuzione (. Cioè è stato precedentemente terminato), ci sono due opzioni:

  1. Dal iOS app programming guide sotto "Tracking Location per l'utente":

    Il servizio di cambio di posizione significativo è altamente raccomandato per le app che non necessitano di dati di localizzazione di alta precisione. Con questo servizio, gli aggiornamenti di posizione vengono generati solo quando la posizione dell'utente cambia in modo significativo; quindi, è ideale per app o app social che forniscono all'utente informazioni non critiche relative alla posizione. Se l'app viene sospesa quando si verifica un aggiornamento, il sistema lo riattiva in background per gestire l'aggiornamento. Se l'app avvia questo servizio e viene quindi terminata, il sistema riavvia automaticamente l'app quando diventa disponibile una nuova posizione. Questo servizio è disponibile in iOS 4 e versioni successive ed è disponibile solo su dispositivi che contengono una radio cellulare.

    Tuttavia, secondo il CLLocationManager class reference, non è troppo preciso e gli aggiornamenti sono frequenti:

    Nota: Apps possono aspettarsi una notifica non appena il dispositivo si muove a 500 metri o più dalla sua precedente notifica. Non dovrebbe aspettarsi notifiche più frequenti di una volta ogni cinque minuti. Se il dispositivo è in grado di recuperare i dati dalla rete, è molto più probabile che il responsabile della posizione invii le notifiche in modo tempestivo.

  2. Region Monitoring funziona in modo simile - tra cui riavviare l'applicazione dopo essere stato terminato - ma con maggiore precisione (a seconda della disponibilità delle reti WiFi e torri cellulari):

    Le distanze di soglia specifici sono determinati dall'hardware e dalle tecnologie di localizzazione attualmente disponibili. Ad esempio, se il Wi-Fi è disabilitato, il monitoraggio della regione è significativamente meno accurato. Tuttavia, a scopo di test, si può presumere che la distanza minima sia di circa 200 metri.

    Un'altra regione monitoraggio considerazione è che (secondo i CLLocationManager class reference) notifiche regione ingresso e di uscita possono essere accolto solo 3-5 minuti o giù di lì dopo aver attraversato i confini della regione.

    In base ai requisiti effettivi, è possibile utilizzare il monitoraggio della regione per ottenere una posizione "approssimativa" e quindi quando l'utente si trova in una regione specifica, avviare il servizio basato su GPS più accurato sul gestore posizione. Quando l'utente lascia la regione di interesse, disattivare il servizio GPS per preservare la batteria e tornare al servizio di monitoraggio posizione approssimativo (ad esempio il monitoraggio della regione) ancora una volta. Ecco un'implementazione di base:

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

    Ricordati di aggiungere le voci appropriate nel file plist dell'applicazione modo l'applicazione verrà eseguito in background con l'accesso alle risorse appropriate:

    MyApp-Info.plist:

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

    Il codice sopra presuppone l'utilizzo di iOS6 e ARC

+0

Sì, certamente sembra così! Hai qualche idea di quale precisione stiamo parlando in questo caso? Perché ho visto alcune app (non le ho scaricate perché erano costose) che avrebbero supportato geo-push ma con una precisione di circa 500m dell'area. Questo sarebbe troppo per il mio scopo. Non so se è possibile selezionare una precisione di circa 50-100 me la quantità di batteria che costerebbe eseguirla sempre. Ora guardo più in dettaglio ora – donparalias

+0

Poiché il servizio di cambio di posizione significativo si basa sul dispositivo che cambia le celle, potrebbe non essere sufficiente. – gavdotnet

+0

Tuttavia, dovrebbe essere possibile ascoltare la notifica di "modifica significativa" che riattiva l'app (se terminata) e quindi inizia a utilizzare i servizi di background in background standard - che fornisce una precisione migliore - finché l'app non viene terminata di nuovo. Ovviamente perderai un po 'di precisione quando l'app non è in esecuzione, ma per il resto del tempo sarebbe accurata come qualsiasi app in background. – gavdotnet