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

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

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

3 ответа

Вот несколько вещей для проверки:

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

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

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

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

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

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

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

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

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

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

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

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

Значительные местоположения меняют отстой!!

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

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

Другие вопросы по тегам