我没有在sim或设备上获得任何位置回调。我已经调用了这段代码:
- (void)startLocationCallbacks: (NSObject*) ignore
{
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
locationManager.distanceFilter = MINIMUM_METERS;
[locationManager startUpdatingLocation];
NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate);
}
并在两者顶部记录日志
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
和
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
但两个日志语句都没有被调用。为我的应用启用了位置通知(如设置中所示,加上我说“允许”。)
我没有获得位置更新的可能原因是什么?
配置/其他信息:
谢谢!
答案 0 :(得分:48)
呼!好的,我找到了。
事实证明,使CLLocationManager
无法触发位置回调的方法之一是在非主线程中进行所有设置。当我将我的设置例程移动到performSelectorOnMainThread
时,所有操作都完全符合预期。
多么噩梦!
希望这个答案有助于其他人......
修改/澄清:强>
最初,我有这样的事情:
- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options
{
// ...[app setup, snip]
[NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil];
}
- (void)postLaunchSetupThread
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
// ...[other setup, snip]
[self setupLocationManager];
[pool release];
}
- (void)setupLocationManager
{
self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
[myLocationManager startLocationUpdates];
}
但是在线程中调用setupLocationManager
会阻止回调。所以我的修复是移动线
[self setupLocationManager];
离开主题并返回appDidFinishLaunchingWithOptions
答案 1 :(得分:15)
实际上你也可以从另一个线程运行它。 来自Apple文档:
您的位置管理器对象的配置必须始终在a上进行 具有活动运行循环的线程,例如应用程序的主循环 线程。
只需确保您的运行循环在该线程上运行,并调度CLLocationManager事件。 更多关于运行循环: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
答案 2 :(得分:1)
适用于iOS 8
1)我在初始化位置管理员后立即放置了这些行。
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
2)我将NSLocationAlwaysUsageDescription添加到plist并将其设置为字符串并添加了一条消息。 3)在我的目标中,我点击了功能选项卡,然后打开后台模式并选中“位置更新”和“使用蓝牙LE附件”
这对我有用
答案 3 :(得分:0)
//查看此 //...CLLocationManager没有正确调用委托方法
// ...在很多R& D之后我正在使用看门狗方法,它称之为“
答案 4 :(得分:0)
在我的情况下,这是因为我的设备无法确定位置 - 而在室内GPS信号不可用,Wi-Fi也断开连接,因此位置管理员只是无法接收任何位置数据,代表是从未打电话过
一旦我连接了Wi-Fi,它就可以工作了(我想在户外移动也应该可以做到这一点,但有时它不是很方便:))