CoreLocation 应用程序在模拟器中工作但不在设备上

Posted

技术标签:

【中文标题】CoreLocation 应用程序在模拟器中工作但不在设备上【英文标题】:CoreLocation app working in Simulator but not on device 【发布时间】:2012-02-01 08:30:21 【问题描述】:

我正在尝试在装有 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");

【问题讨论】:

【参考方案1】:

您的 iPhone 中的定位服务可能已关闭,请打开并重试。

在 iPhone->setting->Location Service 中将其设置为 ON。

【讨论】:

iPhone 定位服务已开启。 请同时添加 locationManager.desiredAccuracy = kCLLocationAccuracyBest;在你的启动方法中 在 start 方法中添加 locationManager.desiredAccuracy = kCLLocationAccuracyBest 后没有成功。 locationManager:didUpdateToLocation:fromLocation 方法在设备上测试时甚至没有被调用一次。 你确定你的 start 方法调用了吗?【参考方案2】:
 NSDate *now = [[NSDate alloc] init];

我认为您尚未将日期初始化为今天的日期。你确定没有窗口或视图的应用程序会被加载到设备中吗?

【讨论】:

我正在为越狱 iPhone 开发这个程序。在越狱的 iPhone 上,加载没有窗口的程序。 这是我的输出:仍然没有成功。进入开始 2012-02-06 15:47:52.346 WhereAmI[743:207] 位置服务已启用 2012-02-06 15:47:52.364 WhereAmI[743:207] 从开始 2012-02-06 15:47 退出:52.368 WhereAmI[743:207] In main 2012-02-06 15:47:52.374 WhereAmI[743:207] 仍在主程序中以退出代码结束:0 没有技术要求应用(不需要 App Store 批准)具有用户界面。【参考方案3】:

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

首先,我刚刚在另一个问题上对此发表了评论。你不需要一直告诉CLLocationManagerstartUpdatingLocation。你可以只打一次电话,直到你决定告诉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 实例不足以保持程序运行。

我不知道为什么它会在模拟器中工作,虽然:(

附:不要担心我上面定义的计时器不会重复。在run: 实现中,我相信它会触发另一个具有不同间隔或选择器的计时器。所以,我的程序实际上一直在运行。

【讨论】:

以上是关于CoreLocation 应用程序在模拟器中工作但不在设备上的主要内容,如果未能解决你的问题,请参考以下文章

UILabel tap 在模拟器中工作但在 iphone 中不工作

后台获取在模拟器中工作但在真实设备中不工作

android:在模拟器中工作但不在手机上的联系人提供程序

地理定位离子在浏览器测试中工作但不在android上

获取在 HTML 页面中工作但不在 JS 中工作 [重复]

请求在CURL中工作但不在Ajax中工作