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】:我认为发布的代码存在一些潜在问题。
首先,我刚刚在另一个问题上对此发表了评论。你不需要一直告诉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
实例不足以保持程序运行。
我不知道为什么它会在模拟器中工作,虽然:(
附:不要担心我上面定义的计时器不会重复。在run:
实现中,我相信它会触发另一个具有不同间隔或选择器的计时器。所以,我的程序实际上一直在运行。
【讨论】:
以上是关于CoreLocation 应用程序在模拟器中工作但不在设备上的主要内容,如果未能解决你的问题,请参考以下文章