StartMonitoringForRegion никогда не вызывает didEnterRegion/didExitRegion

Я пытаюсь получить iPhone4 для мониторинга регионов и уведомлять меня по вызову didEnterRegion или didExitRegion. Я не могу заставить его работать. Я читал, вероятно, все связанные с ним enries, плюс еще несколько статей в Интернете... iOS просто не вызывает мои методы CLLocationManagerDelegate. Что я сделал:

У меня есть простой AppDelegate, который также реализует методы CLLocationManagerDelegate для didEnterRegion и didExitRegion. В рамках этих методов я просто использую UILocalNotification для сообщения о событии. Из ViewController я создаю Region (текущее местоположение) с aRadius 1000meters.

Ответ 1

Вот что нужно проверить:

  • Прежде чем вы начнете отслеживать регионы своего кода, вызовите [CLLocationManager regionMonitoringAvailable] и [CLLocationManager regionMonitoringEnabled], чтобы убедиться, что услуга доступна и включена на пользовательском телефоне.

  • Удостоверьтесь, что у вашего менеджера местоположений delegate установлено значение, на котором вы реализовали locationManager:didEnterRegion: и/или locationManager:didExitRegion:.

  • Убедитесь, что у вас нет опечаток в этих сигнатурах метода. Небольшая ошибка заглавной буквы приведет к сбою этих сообщений. Скопируйте/вставьте их в свой код и убедитесь, что они соответствуют:

    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
    { /* Handle enter */ }
    
    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
    { /* Handle exit */ }
    
  • Убедитесь, что ваш делегат также реализует locationManager:monitoringDidFailForRegion:withError:, так как он может сказать вам, почему служба терпит неудачу.

    - (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
    {
        NSLog(@"Region monitoring failed with error: %@", [error localizedDescription]);
    }
    
  • Одна из причин такого сбоя в мониторинге заключается в том, что Core Location налагает ограничение на количество регионов, которым разрешено отслеживать приложение. На практике этот предел, по-видимому, составляет около десяти регионов за приложение. Поэтому убедитесь, что вы удаляете области, которые вам не нужны, используя stopMonitoringForRegion:, и контролируйте только те области, которые ближе к пользователю, как рекомендовано Apple Руководство по программированию местоположения:

    Вы всегда должны быть разумными при указании набора регионов на монитор. Регионы являются общим системным ресурсом, а общее число Регионы, доступные в масштабах всей страны, ограничены. По этой причине Core Расположение ограничивает количество областей, которые могут быть одновременно контролируется одним приложением. Чтобы обойти эти ограничения, вы следует рассмотреть возможность регистрации только тех регионов в окрестности. По мере изменения местоположения пользователей вы можете удалить регионы, которые теперь более далекие пути и добавление регионов, которые появляются на пути пользователей. Если вы пытаетесь зарегистрировать регион, а пространство недоступно, менеджер местоположений вызывает locationManager:monitoringDidFailForRegion:withError: метод его делегировать с кодом ошибки kCLErrorRegionMonitoringFailure.

  • Надеюсь, что это очевидно, но убедитесь, что вы вызываете startMonitoringForRegion:desiredAccuracy: после настройки вашего делегата.

  • Когда вы инициализируете объект CLRegion, который вы контролируете, используя initCircularRegionWithCenter:radius:identifier:, убедитесь, что вы используете уникальный идентификатор для каждого региона.

  • Если ваши методы locationManager:didEnterRegion: и locationManager:didExitRegion: получаются правильно, когда приложение активно, но не тогда, когда ОС перезагружает ваше приложение в фоновом режиме после его убийства, возможно, вы не можете правильно инициализировать свою менеджера местоположения и установки его делегата в этом случае. Если вы перейдете границу зарегистрированного региона, когда приложение не запущено, ОС запустит ваше приложение в фоновом режиме, которое вы можете обнаружить с помощью if ([launchOptions objectForKey:@"UIApplicationLaunchOptionsLocationKey"]]) {} в методе application:didFinishLaunchingWithOptions: вашего делегата приложения. Ваше приложение, вероятно, не будет загружать какие-либо представления при его запуске в фоновом режиме, так что вам нужно убедиться, что application:didFinishLaunchingWithOptions: вызывает некоторый путь к коду, который создает экземпляр вашего объекта менеджера местоположений и задает его делегат в этом случае. Как только будет установлено свойство делегирования вашего менеджера местоположений, будут отправлены любые события мониторинга ожидающего региона.

Ответ 2

То же самое здесь. Я тоже пытаюсь получить didEnterRegion и уведомить меня. Я вижу, что метод никогда не вызван. Итак, у меня есть пользовательская проверка (newLocation, функция oldLocation)

выделите расстояние и:

{
distance = [newLocation distanceFromLocation:(your location)];
if(distance < 300){
[appDelegate Notify:@"Entering "];
}

Значения значительных изменений:

Ответ 3

Известна ошибка с iOS 5.1 Simulator, в которой методы делегатского мониторинга не вызываются. Мой опыт заключается в том, что он вызовет первый метод, инициированный (либо в или из), но и не последующий вызов после этого. Я подал радары с Apple на этот факт, но в основном игнорировался для текущей итерации. Они ответили, спрашивают, работает ли она на бета-версии iOS 6, какой она есть. Я не ожидаю, что они исправят его на 5.1 вообще.

Вы можете загрузить симулятор 5.0, который по-прежнему работает, или загрузить бета-версию iOS 6 (если вы платный разработчик) и протестировать там место. Вне этого нам нужно будет увидеть код, показывающий, правильно ли настроено все. Я предполагаю, что появляется значок мониторинга области, вы делаете это правильно и просто жертвы ошибки симулятора.