Я пытаюсь контролировать значительные изменения местоположения для моего пользователя. Поэтому я подписался на значительное событие изменения местоположения в приложении, но я не назначил делегата (место, где я написал код для запуска локальных уведомлений) менеджеру местоположения. Я не понимаю, почему работает следующий код.Почему уведомления меняются при изменении местоположения?
ViewController
- (void)viewDidLoad {
[super viewDidLoad];
if (nil == locationManager){
locationManager = [[CLLocationManager alloc] init];
if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[locationManager setAllowsBackgroundLocationUpdates:YES];
}
}
locationManager.delegate = self;
if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
[locationManager requestAlwaysAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
}
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations {
CLLocation* location = [locations lastObject];
NSLog(@"latitude %+.6f, longitude %+.6f\n",
location.coordinate.latitude,
location.coordinate.longitude);
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
localNotification.alertBody = @"Your alert message";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
CLLocationManager *locationManager = [[CLLocationManager alloc]init];
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
locationManager.activityType = CLActivityTypeOtherNavigation;
[locationManager startMonitoringSignificantLocationChanges];
}
return YES;
}
Согласно документации here. Приложения, использующие эти службы, могут быть прекращены и впоследствии перезапущены при поступлении новых событий. Хотя само приложение перезагружено, службы определения местоположения не запускаются автоматически. И Чтобы получить эти данные, вы должны создать новый объект CLLocationManager и перезапустить службы определения местоположения, которые у вас были до завершения вашего приложения. Когда вы перезапускаете эти службы, диспетчер местоположений доставляет все ожидающие обновления местоположения своему делегату.
Но в делегате приложения я не назначил какого-либо делегата новому экземпляру диспетчера местоположений, и я все еще получаю уведомления.
Внедрили ли вы 'делегат обратные вызовы' в' делегат приложения '. Является ли 'ViewController', в создании которого' viewDidLoad' 'locationManager' создан' rootViewController' или создается экземпляр после запуска приложения. –
no Я не реализовал делегирование делегатов в делегате приложения, но да, ViewController - это мой rootViewController – mdanishs
Поскольку вы используете 'storyboard' для загрузки' rootViewController'. «ViewDidLoad» запускается сразу же при запуске приложения и, следовательно, вы получаете обратный вызов делегата. –