CLLocationManager不能获取城市名称

我正在尝试使用以下代码使用CLLocationManager获取当前的城市和国家 –

 #pragma mark - Core Location Delegate Methods - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init]; [reverseGeocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!"); if (error){ NSLog(@"Geocode failed with error: %@", error); return; } NSLog(@"Received placemarks: %@", placemarks); CLPlacemark *myPlacemark = [placemarks objectAtIndex:0]; NSString *countryCode = myPlacemark.ISOcountryCode; NSString *countryName = myPlacemark.country; NSString *city1 = myPlacemark.subLocality; NSString *city2 = myPlacemark.locality; NSLog(@"My country code: %@, countryName: %@, city1: %@, city2: %@", countryCode, countryName, city1, city2); }]; } - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { CLLocationDirection th=[newHeading trueHeading]; NSLog(@"True Heading value is=%f",th); CLLocationDirection magnetic=[newHeading magneticHeading]; NSLog(@"Magnetic Heading value is=%f",magnetic); } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSString *errorType = (error.code == kCLErrorDenied) ? NSLocalizedString(@"access_denied", @"") : NSLocalizedString(@"unknown_error", @""); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"error_getting_location", @"") message:errorType delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", @"") otherButtonTitles:nil]; [alert show]; } 

它总是给结果 –

我的国家代码:IN,countryName:India,city1:(null),city2:(null)

我不知道这可能是什么问题。 有没有人遇到这个问题,无法使用CLLocationManager获取城市名称

编辑:

 - (void) getReverseGeocode { CLGeocoder *geocoder = [[CLGeocoder alloc] init]; if(currentLatLong.count > 0) { CLLocationCoordinate2D myCoOrdinate; myCoOrdinate.latitude = LatValue; myCoOrdinate.longitude = LangValue; CLLocation *location = [[CLLocation alloc] initWithLatitude:myCoOrdinate.latitude longitude:myCoOrdinate.longitude]; [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { if (error) { NSLog(@"failed with error: %@", error); return; } if(placemarks.count > 0) { NSString *MyAddress = @""; NSString *city = @""; if([placemark.addressDictionary objectForKey:@"FormattedAddressLines"] != NULL) MyAddress = [[placemark.addressDictionary objectForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]; else MyAddress = @"Address Not founded"; if([placemark.addressDictionary objectForKey:@"SubAdministrativeArea"] != NULL) city = [placemark.addressDictionary objectForKey:@"SubAdministrativeArea"]; else if([placemark.addressDictionary objectForKey:@"City"] != NULL) city = [placemark.addressDictionary objectForKey:@"City"]; else if([placemark.addressDictionary objectForKey:@"Country"] != NULL) city = [placemark.addressDictionary objectForKey:@"Country"]; else city = @"City Not founded"; NSLog(@"%@",city); NSLog(@"%@", MyAddress); } }]; } } 

你知道苹果地图和那里的数据库的位置,最好尝试与谷歌地点的API获取更准确和详细的信息反向地理编码。 我已经尝试了相同的自动填充地名,但没有工作,所以去使用谷歌地方的API,还有一个免费的API尝试geonames.org

在.h文件中

 #import <CoreLocation/CoreLocation.h> @interface ClassDemo : NSObject<NSXMLParserDelegate,CLLocationManagerDelegate> { BOOL got; BOOL needParser; NSMutableArray *currentplaceArray; } @property (nonatomic, retain) CLLocation *currentLocation; @property (nonatomic, getter = isResultsLoaded) BOOL resultsLoaded; @property (strong, nonatomic) CLLocationManager *locationManager; @property (strong, nonatomic) CLGeocoder *geoCoder; 

以.m

 @synthesize locationManager,currentLocation; - (void)viewDidLoad { got=NO; needParser=YES; currentplaceArray=[[NSMutableArray alloc]init]; //******** Location MAnager Allocation And Intialization********// locationManager = [[CLLocationManager alloc] init]; locationManager.delegate=self; [locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { if ([self isResultsLoaded]) { return; } [self setResultsLoaded:YES]; currentLocation = newLocation; NSLog(@"%@",currentLocation); NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.googleapis.com/maps/api/geocode/xml?latlng=%f,%f&sensor=false",newLocation.coordinate.latitude,newLocation.coordinate.longitude]]]; [parser setDelegate:self]; [parser parse]; } -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSLog(@"%@",elementName); if([elementName isEqualToString:@"formatted_address"]) { got = YES; //got is a BOOL } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(got&&needParser){ got=NO; NSLog(@"the address is = %@",string); NSArray *tempPlaceArray=[string componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@",/"]]; NSLog(@"%@",tempPlaceArray); for(int i=0; i <[tempPlaceArray count]; i++) { NSString *tempString=[[tempPlaceArray objectAtIndex:i]stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSLog(@"%@",tempString); if (![currentplaceArray containsObject:tempString]) { if ([tempString length]!=0) { [currentplaceArray addObject:tempString]; } } } needParser=NO; TempLocation *obj=[[TempLocation alloc]init]; obj.countryName=[currentplaceArray objectAtIndex:[currentplaceArray count]-1]; obj.stateName=[currentplaceArray objectAtIndex:[currentplaceArray count]-2]; obj.cityName=[currentplaceArray objectAtIndex:[currentplaceArray count]-3]; obj.fullAdd=string; [[Database getDBObject]insertIntoCurrentLocationTable:obj.cityName :obj.stateName :obj.countryName:obj.fullAdd]; } } 

为临时存储创build临时位置类。 你也可以保存到数据库中。 享受编码。

即使我注意到同样的问题。 经过许多步道和错误,我发现我使用的无线networking的问题。 如果信号强度低,你会得到城市为零。 尝试改变你的连接。