startMonitoringForRegion никогда не вызывает didEnterRegion / didExitRegion - PullRequest
11 голосов
/ 11 ноября 2010

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

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

Ответы [ 3 ]

43 голосов
/ 06 декабря 2011

Вот несколько вещей, которые нужно проверить:

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

2 голосов
/ 09 июля 2012

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

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

2 голосов
/ 30 декабря 2010

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

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

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

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

...