Приложение CoreLocation работает в симуляторе, но не на устройстве - PullRequest
1 голос
/ 01 февраля 2012

Я пытаюсь запустить эту программу на iPhone 3GS с iOS 5. Программа отлично работает на симуляторе, но не работает на устройстве.Нет ошибок, но метод делегата locationManager:didUpdateToLocation:fromLocation: не вызывается при запуске на устройстве.

Я просто хочу печатать местоположение через каждые 30 секунд.

int main(int argc, char *argv[])
{
  @autoreleasepool
  {
    iLocation *loc = [[iLocation alloc] init];

    [loc start];

    NSLog(@"In main");

  }

  return 0;
}


@interface iLocation : NSObject <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

-(void) start;
-(void) startAgain;

@end



#import "BIDAppDelegate.h"

@implementation iLocation

@synthesize locationManager;

-(void) start
{
  NSLog(@"Enter in start");

  locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate = self;

  locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  locationManager.distanceFilter = kCLDistanceFilterNone;

  if([CLLocationManager locationServicesEnabled])
  {
    NSLog(@"Location Services are enabled");

    [locationManager startUpdatingLocation];
  }
  else
    NSLog(@"Location Services are disabled");


  NSLog(@"Exit from start");

}


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


- (void)locationManager: (CLLocationManager *)manager
  didUpdateToLocation: (CLLocation *)newLocation
  fromLocation: (CLLocation *)oldLocation
{

  NSLog(@"Enter in didUpdateToLocation");

  NSString *latitudeString = [NSString stringWithFormat:@"%g\u00B0",
                              newLocation.coordinate.latitude];

  NSLog(@"Latitude = %@", latitudeString);


  NSString *longitudeString = [NSString stringWithFormat:@"%g\u00B0",
                               newLocation.coordinate.longitude];

  NSLog(@"Longitude = %@", longitudeString);


  NSString *horizontalAccuracyString = [NSString stringWithFormat:@"%gm",
                                        newLocation.horizontalAccuracy];

  NSLog(@"Horizontal Accuracy = %@", horizontalAccuracyString);


  NSString *altitudeString = [NSString stringWithFormat:@"%gm",
                              newLocation.altitude];

  NSLog(@"Altitude = %@", altitudeString);


  NSString *verticalAccuracyString = [NSString stringWithFormat:@"%gm",
                                      newLocation.verticalAccuracy];

  NSLog(@"Vertical Accuracy = %@", verticalAccuracyString);


  NSTimer *timer = [NSTimer timerWithTimeInterval:20.0
                                           target:self
                                         selector:@selector(startAgain)
                                         userInfo:nil
                                          repeats:YES];

  [[NSRunLoop currentRunLoop] addTimer:timer
                               forMode:NSDefaultRunLoopMode];


  NSLog(@"Exit from didUpdateToLocation");
}

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

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

в iPhone-> setting-> Location Service включите ее.

1 голос
/ 01 февраля 2012
 NSDate *now = [[NSDate alloc] init];

Я думаю, вы не инициализировали дату для сегодняшней даты. И вы уверены, что приложение без окна или вида будет загружено в устройство? ..

0 голосов
/ 17 мая 2012

Я думаю, что есть пара потенциальных проблем с размещенным кодом.

Прежде всего, я только что прокомментировал это по другому вопросу. Вам не нужно постоянно говорить 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: он запускает другой таймер с другим интервалом или селектором. Итак, моя программа на самом деле продолжает работать.

...