2012-02-09 4 views
3

Я написал небольшое приложение, которое запускается как демон. Он в основном просто выводит местоположение GPS-телефонов.iOS jailbreak - как получить местоположение в фоновом режиме

main.m:

int main(int argc, char *argv[]) { 

NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; 
LocationController *obj = [[LocationController alloc] init]; 
[obj getLocation];  
NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
[runLoop run]; 

[p drain]; 
return 0; 
} 

LocationController.m

@implementation LocationController 
@synthesize locationManager; 

-(id)init { 
    self = [super init]; 
    if(self) { 
     trackingGPS = false; 
     locationManager = [[CLLocationManager alloc] init]; 
     locationManager.delegate = self; 
    } 
    return self; 
} 

-(void)getLocation { 
    [locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation  *)newLocation fromLocation:(CLLocation *)oldLocation { 
    NSLog(@"NEW LOCATION :: %@", newLocation); 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    NSLog(@"LOCATION ERROR : %@", error); 
} 

-(void) dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 
@end 

Так что, если я запустить приложение вручную от трамплина, он отлично работает и регистрирует местоположение GPS ... по крайней мере, в течение 15-20 секунд ... тогда трамплин завершает приложение, потому что он не repsond - ожидаемое поведение.

Если я запускаю приложение при запуске (launchDaemon), он также запускается нормально, но функция делегата 'didUpdateToLocation' никогда не будет вызвана!

Я нахожусь на iOS 5, поэтому не уверен, в чем проблема. Любая помощь действительно оценена.

THX !!

ответ

1

Вместо того, чтобы называть «startUpdatingLocation», вы должны использовать startMonitoringSignificantLocationChanges. Всякий раз, когда местоположение пользователя изменяется значительно, оно вызывает ваше приложение, и у вас будет время для обработки фоновой обработки и выясните, хотите ли вы открыть приложение или нет.

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

Для получения дополнительной информации см. Это question.

+0

эй агуи. Thx для подсказки, но это все равно не сработает! Функция делегата не вызывается. Но я думаю, что это просто невозможно в iOS 5+ – Pascal