2015-05-22 13 views
5

Moja aplikacja musi pobrać lokalizację użytkownika, gdy aplikacja jest aktywna, a kiedy nieaktywna i zabita. Gdy lokalizacja użytkownika znajduje się w pobliżu sklepu, aplikacja musi wysłać powiadomienie lokalne.Uzyskiwanie lokalizacji aplikacji na iOS, gdy jest ona w tle, a nawet zabity

Nie jestem pewien, co dokładnie się dzieje, ale nie mogę sprawić, aby moja aplikacja znajdowała się w tle i budziła się po zabiciu.

mam menedżera lokalizacji (Singleton, używany boths przypadkach whenInUse i zawsze), a ja zarówno NSLocationAlwaysUsageDescription i NSLocationWhenInUseUsageDescription zdefiniowane w .plist

Co robię to:

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

} 

Czy robię coś złego? Nie jestem pewien, czy użycie geofencing jest absolutnie konieczne, ale to, co przeczytałem przy pomocy startMonitoringSignificantLocationChanges, wystarczy.

Odpowiedz

8

Aby uzyskać lokalizację w tle, użyj następującego kodu. Dzięki temu aplikacja będzie działać przez dłuższy czas, ponownie uruchamiając zadanie w tle.

Aby to wykorzystać, trzeba włączyć Tło Tryb w Możliwości w ustawieniach projektu z Tło Fetch i Lokalizacja Aktualizacje włączony.

- (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

Dzięki Utsav !! Gdzie muszę wstawić kod menedżera lokalizacji applicationDidEnterBackground? – Stacky

+0

@Stacky Twój kod w didEnterBackground nie będzie potrzebny. Nigdy nie musisz wywoływać metody stopUpdatingLocation, ponieważ potrzebujesz ciągłych aktualizacji lokalizacji. Jeśli wywołasz polecenie Stop UpdatingLocation, użytkownik przestanie otrzymywać aktualizacje lokalizacji. Powinieneś to zrobić tylko wtedy, gdy użytkownik wyloguje się z aplikacji. –

+0

Przepraszam, jeśli zapytam głupią rzecz @utsav, ale czy nie jest konieczne wywoływanie metody stopUpdatingLocation (ponieważ jest używana, gdy aplikacja jest uruchomiona), a następnie wywołanie funkcji StartMonitoringSignificantLocationChanges? – Stacky

Powiązane problemy