我刚刚更新到Xcode 6 / iOS 8 SDK,我在模拟器中的位置服务模拟开始无法正常工作。我更新之前没事(我目前无法在真实设备上测试)。现在,当我选择一个模拟位置时,没有任何反应。未调用委托的-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
方法。我重新启动了Xcode,清理了构建文件夹,没有任何改变。为什么会发生这种情况?
答案 0 :(得分:14)
自IOS 8起,您需要在启动CLLocationManager之前请求授权。
您是否正在调用其中一种方法?
[self.locationManager requestWhenInUseAuthorization]; // For foreground access
[self.locationManager requestAlwaysAuthorization]; // For background access
如果您在XCode 6之前创建了项目,则可能还需要为新权限添加info.plist条目。
有关详细信息,请查看此帖子:Location Services not working in iOS 8
答案 1 :(得分:14)
在方法中添加以下代码
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[self.locationManager requestWhenInUseAuthorization];
}
同时在info.plist
文件
键:NSLocationWhenInUseUsageDescription
值:使用当前位置
答案 2 :(得分:2)
使用Xcode 6.3.1我已经让位置选择停止更新。修复是运行另一个项目,选择"模拟位置>不要模拟位置"然后再次构建原始项目以恢复正常的位置设置。
答案 3 :(得分:0)
其他答案是正确的,但我还得在我获得一个位置之前重置模拟器,而它在设备上工作正常。该应用程序最初是在iOS 8之前安装在该模拟器上的。
要重置模拟器:
答案 4 :(得分:0)
- (void)startLocationUpdates{
geocoder = [[CLGeocoder alloc] init];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
[locationManager requestWhenInUseAuthorization];
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
CLLocation *currentLocation = newLocation;
if (currentLocation != nil) {
}
// Reverse Geocoding
[geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) {
if (error == nil && [placemarks count] > 0) {
placemark = [placemarks lastObject];
fullAddress = [NSString stringWithFormat:@"%@,%@,%@,%@",
placemark.thoroughfare,
placemark.locality,
placemark.administrativeArea,
placemark.country];
subtitleLocation = [NSString stringWithFormat:@"PostalCode::%@",
placemark.postalCode];
} else {
// NSLog(@"%@", error.debugDescription);
}
} ];
}
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error{
NSLog(@"Cannot find the location.");
}