2015-05-22 12 views
5

La mia app deve ottenere la posizione dell'utente quando l'app è attiva e quando è inattiva e viene uccisa. Quando la posizione dell'utente è vicino a un negozio, l'app deve inviare una notifica locale.Ottenere la posizione per un'app iOS quando è in background e persino uccisa

Non sono sicuro di cosa stia succedendo esattamente, ma non sono in grado di fare in modo che la mia app trovi la posizione sullo sfondo e la riattiva quando viene uccisa.

Ho un location manager (Singleton, usato per boths casi whenInUse e sempre), e ho sia NSLocationAlwaysUsageDescription e NSLocationWhenInUseUsageDescription definito .plist

Quello che sto facendo è:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //The app has been killed/terminated (not in background) by iOS or the user. 
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]){ 

     _locationManager = [CoreLocationManager sharedInstance]; 
     _locationManager.isAppActive = NO; 
     _locationManager.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
     _locationManager.locationManager.activityType = CLActivityTypeOtherNavigation; 

     if ([_locationManager.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
      [_locationManager.locationManager requestAlwaysAuthorization]; 
     } 

     [_locationManager addLocationManagerDelegate:self]; 
    } 
} 


- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    if (_locationManager.locationManager){ 
     _locationManager.isAppActive = YES; 
     [_locationManager.locationManager stopMonitoringSignificantLocationChanges]; 
    } 

    _locationManager = [CoreLocationManager sharedInstance]; 

    if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [_locationManager.locationManager requestAlwaysAuthorization]; 
    } 

    if ([_locationManager.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
     [_locationManager.locationManager requestWhenInUseAuthorization]; 
    } 

    [_locationManager addLocationManagerDelegate:self]; 

    [_locationManager.locationManager startUpdatingLocation]; 

} 


- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    _locationManager.isAppActive = NO; 

    if (_locationManager.locationManager){ 
     [_locationManager.locationManager stopUpdatingLocation]; 
     [_locationManager.locationManager stopMonitoringSignificantLocationChanges]; 
    } 

    if ([_locationManager.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [_locationManager.locationManager requestAlwaysAuthorization]; 
    } 

    [_locationManager.locationManager startMonitoringSignificantLocationChanges]; 

} 

Faccio qualcosa di sbagliato? Non sono sicuro se sia strettamente necessario utilizzare il geofencing, ma per le cose che ho letto con startMonitoringSignificantLocationChanges è sufficiente.

risposta

8

Per ottenere una posizione sullo sfondo, utilizzare il seguente codice. Farà funzionare la tua app in background per un lungo periodo, riavviando l'attività in background ogni volta.

Per utilizzare questo, è necessario attivare la modalità sfondo in Capabilities nelle impostazioni del progetto con Background Fetch e Località Aggiornamenti acceso.

- (void)applicationDidEnterBackground:(UIApplication *)application { 

    if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 

     if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
      UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance 

      __block UIBackgroundTaskIdentifier background_task; //Create a task object 

      background_task = [application beginBackgroundTaskWithExpirationHandler: ^{ 
       [application endBackgroundTask:background_task]; //Tell the system that we are done with the tasks 
       background_task = UIBackgroundTaskInvalid; //Set the task to be invalid 
       //System will be shutting down the app at any point in time now 
      }]; 
     } 
    } 
} 
+0

Grazie Utsav !! Dove devo inserire il codice locationmanager di applicationDidEnterBackground? – Stacky

+0

@Stacky Il tuo codice in didEnterBackground non sarà necessario. Non hai mai bisogno di chiamare stopUpdatingLocation in quanto ti occorrono aggiornamenti di posizione continui. Se si chiama stop UpdatingLocation, l'utente interromperà l'aggiornamento della posizione. Dovresti farlo solo quando l'utente si disconnette dall'app –

+0

Scusa se chiedo una cosa stupida @utsav, ma non è necessario chiamare stopUpdatingLocation (perché viene utilizzato quando l'app è in esecuzione) e quindi chiamare startMonitoringSignificantLocationChanges? – Stacky

Problemi correlati