CLLocationManager startUpdatingLocation不调用locationManager:didUpdateLocations:或locationManager:didFailWithError:
我想在我的iOS项目中使用CLLocationManager
框架来访问用户的位置,但是当我打电话
[locationManager startUpdatingLocation]
locationManager:didUpdateLocations:
或locationManager:didFailWithError:
都被调用。
//myViewController.h @interface myViewController : UITableViewController <CLLocationManagerDelegate> @end //myViewController.m @implementation myViewController{ CLLocationManager *locationManager; } //edit - (void)viewDidLoad { [super viewDidLoad]; locationManager = [[CLLocationManager alloc] init]; } //finish edit -(void)getLocation { locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest; [locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *newLocation = locations[[locations count] -1]; CLLocation *currentLocation = newLocation; NSString *longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]; NSString *latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]; if (currentLocation != nil) { NSLog(@"latitude: %@", latitude); NSLog(@"longitude: @"%@", longitude); }else { UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } } @end
尽pipe它在文档中说了什么,但都不会调用委托方法:
调用这个方法会导致位置pipe理器获得一个初始的位置修正(可能需要几秒钟的时间),并通过调用它的locationManager:didUpdateLocations:
通知你的委托locationManager:didUpdateLocations:
method […]除了你的委托对象locationManager:didUpdateLocations:
方法,它还应该实现locationManager:didFailWithError:
方法来响应潜在的错误。
不知道如何debugging这个问题。
谢谢,
JA
只需将其添加到info.plist
NSLocationAlwaysUsageDescription —我需要位置
NSLocationWhenInUseUsageDescription —我需要位置
隐私 – 位置使用说明—我需要位置
locationManager = [[CLLocationManager alloc] init]; locationManager.delegate=self; locationManager.desiredAccuracy=kCLLocationAccuracyBest; locationManager.distanceFilter=kCLDistanceFilterNone; [locationManager requestWhenInUseAuthorization]; [locationManager startMonitoringSignificantLocationChanges]; [locationManager startUpdatingLocation];
现在它会确定地调用你的didUpdateToLocation。
更多细节请点击这里
定位服务工作有点不同,从iOS 8开始。
主要是,你需要添加一个关键NSLocationWhenInUseUsageDescription
到你的Info.plist文件中,并添加一个描述为什么你的应用需要Location,比如“Location needed …”。
请注意,您可能还需要检查iOS版本。 只有iOS 8和更高版本的位置pipe理器才能requestWhenInUseAuthorization
调用。
以下链接显示更多详情: http : //nevan.net/2014/09/core-location-manager-changes-in-ios-8/
祝你好运!
在iOS 8.0中,您需要首先调用-[CLLocationManager requestWhenInUseAuthorization ]
或-[CLLocationManager requestAlwaysAuthorization]
以便用户被要求为您的应用授予使用该位置的权限。
您强烈需要检查您是否在主线程上初始化CLLocationManager。 在其他情况下,你将不会得到updateLocation事件。
我无法在苹果文档中find这样的信息,但无论如何它对我都有效。
你需要把下面的东西添加到你的项目中,
-
在你的项目plist添加这些东西:
-
Key: NSLocationAlwaysUsageDescription Type:String
-
Key: NSLocationWhenInUseUsageDescription Type:String
-
-
在带有
[locationManager startUpdatingLocation]
的.m文件中添加这个条件:if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) [locationManager requestAlwaysAuthorization];`
那么只有你的CLLocationManager
委托方法会被调用。
我认为你应该检查这个链接。你在声明时不保留位置pipe理器对象。
请给财产给你对象@属性(非primefaces,强大)
为什么在iPhone SDK 4.0中没有调用CLLocationManager委托?