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.
Dzięki Utsav !! Gdzie muszę wstawić kod menedżera lokalizacji applicationDidEnterBackground? – Stacky
@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. –
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