0

Я пытаюсь контролировать значительные изменения местоположения для моего пользователя. Поэтому я подписался на значительное событие изменения местоположения в приложении, но я не назначил делегата (место, где я написал код для запуска локальных уведомлений) менеджеру местоположения. Я не понимаю, почему работает следующий код.Почему уведомления меняются при изменении местоположения?

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 и перезапустить службы определения местоположения, которые у вас были до завершения вашего приложения. Когда вы перезапускаете эти службы, диспетчер местоположений доставляет все ожидающие обновления местоположения своему делегату.

Но в делегате приложения я не назначил какого-либо делегата новому экземпляру диспетчера местоположений, и я все еще получаю уведомления.

+0

Внедрили ли вы 'делегат обратные вызовы' в' делегат приложения '. Является ли 'ViewController', в создании которого' viewDidLoad' 'locationManager' создан' rootViewController' или создается экземпляр после запуска приложения. –

+0

no Я не реализовал делегирование делегатов в делегате приложения, но да, ViewController - это мой rootViewController – mdanishs

+0

Поскольку вы используете 'storyboard' для загрузки' rootViewController'. «ViewDidLoad» запускается сразу же при запуске приложения и, следовательно, вы получаете обратный вызов делегата. –

ответ

0

Похоже, вы выделяете два разных экземпляра locationManager, которые работают независимым образом. Вам необходимо изменить его на это:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    ... 

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { 
     // Notify the app's UI to instantiate your viewController 
     // that then re-initialises its own locationManager. 
    } 

    return YES; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^