CoreLocation应用程序在Simulator中工作但不在设备上工作

时间:2012-02-01 08:30:22

标签: iphone core-location jailbreak

我正在尝试使用iOS 5在iPhone 3GS上运行此程序。程序在模拟器上运行正常但在设备上不起作用。没有错误,但在设备上运行时不会调用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 个答案:

答案 0 :(得分:2)

您的位置服务可能已在iPhone上关闭,请再试一次。

在iPhone-&gt; setting-&gt;位置服务将其设置为开启。

答案 1 :(得分:1)

 NSDate *now = [[NSDate alloc] init];

我想你还没有初始化今天的日期。你确定没有窗口或视图的应用程序会加载到设备中吗??

答案 2 :(得分:0)

我认为发布的代码存在一些潜在的问题。

首先,我在另一个问题上对此进行了评论。您无需一直告诉CLLocationManager startUpdatingLocation。您可以拨打一次电话,直到您决定将其告知stopUpdatingLocation。每次它通过

为您提供新的位置

locationManager:didUpdateToLocation:fromLocation

你保存/使用它。如果您愿意,可以每隔30秒启动一次计时器,如果您没有更新的位置,则使用过去30秒内的计时器。或使用locationManager.location获取最新的位置修复。

See Apple's docs on CLLocationManager's 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:实现中,我相信它会触发另一个具有不同间隔或选择器的计时器。所以,我的程序实际上确实在继续运行。