我正在尝试使用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
答案 0 :(得分:7)
<强>编辑:强>
- (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);
}
}];
}
}
答案 1 :(得分:0)
您了解苹果地图和该地点的数据库,最好尝试使用google places api获取更准确和详细的反向地理编码信息。我已经尝试过相同的自动填充地名,但没有用,所以去使用google places api,还有一个免费的api尝试 geonames.org
答案 2 :(得分:0)
#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;
in .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];
}
}
为临时存储设置临时位置类。您还可以将其保存到数据库中。 享受编码。
答案 3 :(得分:0)
即使我注意到同样的问题。经过多次跟踪和错误后,我发现了wifi使用的问题。如果信号强度很低,你的城市将为零。尝试更改您的连接。