Джейлбрейк iOS - как получить местоположение в фоновом режиме
Я написал небольшое приложение, которое запускается как демон. Это в основном будет просто выводить местоположение телефона GPS.
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 секунд... тогда трамплин завершает приложение, потому что оно не отвечает - ожидаемое поведение.
Однако, если я запускаю приложение при запуске (launchDaemon), оно также запускается нормально, но функция делегата didUpdateToLocation никогда не вызывается!!
Я на iOS 5, так что не уверен, в чем проблема. Любая помощь действительно ценится.
СПАСИБО!!
1 ответ
Вместо вызова "startUpdatingLocation", вы должны использовать startMonitoringSignificantLocationChanges. Всякий раз, когда местоположение пользователя существенно меняется, оно вызывает ваше приложение, и у вас будет некоторое время, чтобы выполнить некоторую фоновую обработку и определить, хотите ли вы открыть свое приложение или нет.
Устройство также может вызывать ваше приложение, если пользователь входит в регион, который вы хотите отслеживать.
Смотрите этот вопрос для более подробной информации.