我正在尝试使用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");
}
答案 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:
实现中,我相信它会触发另一个具有不同间隔或选择器的计时器。所以,我的程序实际上确实在继续运行。