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.
Grazie Utsav !! Dove devo inserire il codice locationmanager di applicationDidEnterBackground? – Stacky
@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 –
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