Почему мой CLLocationManager не отвечает на startMonitoringForRegion? - PullRequest
4 голосов
/ 30 марта 2012

Внизу (в AppDelegate.m) вы видите мои CLLocationManager методы делегата, ни один из них не вызывается.Я использую файл GPX, но даже если регионы не вводятся и не завершаются, необходимо вызвать метод делегата didStartMonitoringForRegion.

SomeOtherClass.m

AppDelegate appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.locationManager startMonitoringForRegion:regionToMonitor desiredAccuracy:kCLLocationAccuracyNearestTenMeters];

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate>
@property (nonatomic, retain) CLLocationManager *locationManager;

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (locationManager==nil) {
        locationManager = [[CLLocationManager alloc] init];  
        locationManager.delegate = self;
    }

    return YES;
}

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Did enter region");
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"Did exit region");
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Fail");
    NSLog(@"%@", [error description]);
}

-(void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    NSLog(@"Did start monitoring for region: %@", region.identifier);
}

Ответы [ 2 ]

2 голосов
/ 10 октября 2012

Прежде всего вы должны добавить следующий метод делегата менеджера расположений и посмотреть, не удалось ли по какой-либо причине зарегистрировать мониторинг региона:

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {
    NSLog(@"%@",error);
}

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

В-третьих, для мониторинга региона не используется технология GPS. Он использует только сотовую антенну вашего оператора сети и всякий раз, когда вы меняете вышку сотовой связи, он запускает системное событие, которое проходит по всем отслеживаемым регионам и проверяет, находится ли регион в новой области, в которой вы сейчас находитесь.

Это означает, что вам следует ожидать меньшей точности в обслуживании, и, следовательно, вам следует увеличить радиус, который вы устанавливаете для региона.

Наконец, если ваше приложение полностью завершено и НЕ приостановлено, ваше приложение получит делегат приложения внутри:

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

a UIApplicationLaunchOptionsLocationKey в словаре launchOptions. Тогда вы обязаны повторно инициализировать свой менеджер местоположений, получить текущее местоположение и запустить локальное push-уведомление для пользователя в течение ограниченного времени, в течение которого ваше приложение работает.

Поскольку приложение не будет нормально работать на этом этапе, но в состоянии ограниченного фонового режима.

Также, если вы хотите протестировать приложение в симуляторе, вы должны добавить файл track.gpx в ваш проект и установить симулятор в режим отслеживания. Убедитесь, что 2 местоположения, которые вы поместили в симуляторе, не очень далеки (так как отслеживание может занять довольно много времени) и задайте их в пути, где он войдет в ваш контролируемый регион. Тогда посмотрите, если вы получите какие-либо обратные вызовы. Не проверяйте его на своем устройстве, так как вам нужно пройти несколько блоков, чтобы увидеть реальное взаимодействие с устройством: -)

0 голосов
/ 10 октября 2012

Не совсем уверен, почему он не получит ваши обратные вызовы. Я расскажу о нескольких вещах, которые я заметил, и вы можете увидеть, помогают ли они.

  1. Вы не устанавливаете desiredAccuracy или distanceFilter в вашем менеджере местоположений. По умолчанию они должны что-то делать, но если ваши местоположения в GPX не соответствуют точности регионов, это может быть недостаточно близко для срабатывания.
  2. Метод, который вы используете для запуска мониторинга, устарел в iOS 6. Вы можете добавить точность в диспетчер местоположений и оставить ее вне своего звонка.
  3. Было бы полезно увидеть, как вы создаете CLRegion для мониторинга, regionToMonitor. Если он создается нормально, как только вы начинаете мониторинг, вы должны увидеть пустую фиолетовую стрелку местоположения. Вы также должны получить вызов делегата -didStartMonitoringForRegion. Если ни один из них не отображается, возможно, у вас просто проблема с настройкой вашего менеджера местоположения.
  4. Одно из предложений - создать собственный класс менеджера местоположений и превратить его в одноэлементный. Это предотвратит случайную инициализацию нескольких делегатов и получение нескольких вызовов. Он также дает вам один чистый класс для хранения всех ваших методов обратного вызова.

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

...