Я думаю, что есть пара потенциальных проблем с размещенным кодом.
Прежде всего, я только что прокомментировал это по другому вопросу. Вам не нужно постоянно говорить CLLocationManager
до startUpdatingLocation
. Вы можете просто сделать этот вызов один раз, пока не решите сообщить ему stopUpdatingLocation
. Каждый раз, когда он дает вам новое местоположение, через
locationManager:didUpdateToLocation:fromLocation
Вы сохраняете / используете его. Вы можете включить таймер каждые 30 секунд, если хотите, и если у вас нет более нового местоположения, используйте тот из последних 30 секунд. Или используйте locationManager.location
, чтобы получить самое последнее исправление местоположения.
См. Документацию Apple по адресу CLLocationManager startUpdatingLocation:
Вызов этого метода несколько раз подряд не приводит к автоматическому
в результате генерируются новые события. Вызов stopUpdatingLocation в
между тем, вызывает новое начальное событие для отправки следующего
раз вы вызываете этот метод.
Во-вторых, из вывода NSLog, который вы показываете выше, и вашей программы main
, похоже, что ваша программа просто завершает работу, прежде чем менеджер местоположений сможет доставить какие-либо данные о местоположении. У меня есть неграфическое приложение для джейлбрейка, в котором есть процесс, который запускается и использует CoreLocation, и моя основная программа выглядит так:
#import "LocationDaemon.h"
int main(int argc, char *argv[]) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
LocationDaemon* daemon = [[LocationDaemon alloc] init];
// start a timer so that the process does not exit.
NSTimer* timer = [[NSTimer alloc] initWithFireDate: [NSDate date]
interval: 1.0
target: daemon
selector: @selector(run:)
userInfo: nil
repeats: NO];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer: timer forMode: NSDefaultRunLoopMode];
[runLoop run];
[daemon release];
[pool release];
[timer release];
return 0;
}
Мне кажется, что вы не добавляете свой таймер до тех пор, пока не получите данные о местоположении, которые вы никогда не получите до выхода из программы. Попробуйте сделать, как я делал выше, и добавить свой таймер раньше. Я также звоню [runLoop run]
, после добавления моего таймера. Я думаю, что вы должны сделать это, чтобы сохранить ваш основной поток в цикле. Ваша основная программа просто вызывает start
, что вызывает startUpdatingLocation
, но эти вызовы не блокируются. Довольно быстро с этим покончено, и программа завершается. Я не думаю, что наличие сохраненного экземпляра CLLocationManager
достаточно для поддержания работы программы.
Я понятия не имею, почему это будет работать в симуляторе, хотя: (
P.S. Не беспокойтесь, что мой таймер, определенный выше, не повторяется. Я полагаю, что в реализации run:
он запускает другой таймер с другим интервалом или селектором. Итак, моя программа на самом деле продолжает работать.