Question

I want to find out the weather from the current location.

For that I used the code as

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [self.locationManager stopUpdatingLocation];

    self.location = newLocation;
//    NSLog(@"lat long = %f,%f",self.location.coordinate.latitude,self.location.coordinate.longitude);

    // Geocode coordinate (normally we'd use location.coordinate here instead of coord).
    // This will get us something we can query Google's Weather API with

    if (boolCurrentlyWorking == NO) {

        CLGeocoder* reverseGeocoder = [[CLGeocoder alloc] init];
        if(reverseGeocoder)
        {
            [reverseGeocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
                CLPlacemark* placemark = [placemarks objectAtIndex:0];
                if (placemark) {
                    //Using blocks, get zip code
                    NSString *zipCode = [placemark.addressDictionary objectForKey:(NSString*)kABPersonAddressZIPKey];
                    NSLog(@"placemark : %@ zipcode : %@",placemark.addressDictionary,zipCode);
                }
            }];

        }else{
            MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:self.location.coordinate];
            geocoder.delegate = self;
            [geocoder start];
        }
     }

    boolCurrentlyWorking = YES;
}

I am not getting zip code here.

Also found out that this method of didupdate location has been deprecated and new method is

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];
    CLLocation *newlocation = location;
    NSLog(@"location : %@",location);
    CLGeocoder* reverseGeocoder = [[CLGeocoder alloc] init];
    if(reverseGeocoder)
    {
        [reverseGeocoder reverseGeocodeLocation:newlocation completionHandler:^(NSArray *placemarks, NSError *error) {
            for(CLPlacemark *placemark in placemarks)
            {
                NSLog(@"plcaemark desc : %@",[placemark description]);
            }
        }];
    }
}

But it also does not contain zipcode.

I got this description

{
    Country = India;
    CountryCode = IN;
    FormattedAddressLines =     (
        NH8C,
        Gujarat,
        India
    );
    Name = NH8C;
    State = Gujarat;
    Street = NH8C;
    Thoroughfare = NH8C;
}

Is there like it does not provide zipcode information and we have to build it? If yes then how?

Was it helpful?

Solution

First of all We are not getting any zip code or postal code for India.

Also Google API has been stop working.

I used yahoo api to find out weather.

Here is the code that might help someone

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [self.locationManager stopUpdatingLocation];

    self.location = newLocation;



        NSString *linkForWoeid = [NSString stringWithFormat:@" http://where.yahooapis.com/geocode?location=%f,%f&flags=J&gflags=R&appid=zHgnBS4m",self.location.coordinate.latitude,self.location.coordinate.longitude];
        NSURL *woeidURL = [NSURL URLWithString:linkForWoeid];
        NSData *WoeidData = [NSData dataWithContentsOfURL:woeidURL];
        if (WoeidData != NULL)
        {
            NSError *woeiderr = nil;
            NSDictionary *aDicWOEIDResp = [NSJSONSerialization JSONObjectWithData:WoeidData options:NSJSONReadingMutableContainers error:&woeiderr];
            NSDictionary *aDictWOEID = [[[[aDicWOEIDResp objectForKey:@"ResultSet"]objectForKey:@"Results"]objectAtIndex:0]objectForKey:@"woeid"];

            NSString *address=[NSString stringWithFormat:@"http://weather.yahooapis.com/forecastrss?w=%@",aDictWOEID];
            ICB_WeatherConditions *icbWeather = [[ICB_WeatherConditions alloc] initWithQuery:address];

}

#import "ICB_WeatherConditions.m"

- (ICB_WeatherConditions *)initWithQuery:(NSString *)query
{
    if (self = [super init])
    {
        NSURL *url = [NSURL URLWithString:query];
        CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease];

        NSDictionary *namespaceMedia = [NSDictionary dictionaryWithObject:@"http://xml.weather.yahoo.com/ns/rss/1.0" forKey:@"yweather"];
        NSArray *nodes = [parser nodesForXPath:@"//channel" error:nil];

        for (CXMLNode *node in nodes) {
            if ([node kind] == CXMLElementKind)
            {
                CXMLElement *element = (CXMLElement *)node;
                for(int i=0;i<[element childCount];i++)
                {
                    NSString *strKey = [[element childAtIndex:i] name];
                    if([strKey isEqual:@"location"])
                    {
                        location = [self stringForXPath:@"@city" ofNode:[element childAtIndex:i] withNameSpace:namespaceMedia];
                    }
                    else if([strKey isEqual:@"item"])
                    {
                        NSArray *nodeItem = [element nodesForXPath:@"//item" error:nil];
                        CXMLElement *elementItem = [nodeItem objectAtIndex:0];
                        for(int j=0;j<[elementItem childCount];j++){
                            NSString *strKeyItem = [[elementItem childAtIndex:j] name];
                            if([strKeyItem isEqual:@"condition"]){
                                condition =[self stringForXPath:@"@text" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia];
                                currentTemp = [[self stringForXPath:@"@temp" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia] intValue];
                            }
                            else if([strKeyItem isEqual:@"forecast"])
                            {
                                NSString *date = [self stringForXPath:@"@date" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia];
                                NSDate *curDate = [NSDate date];
                                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                                dateFormatter.dateFormat = @"dd MMM yyyy";
                                NSString *strCurDate = [dateFormatter stringFromDate:curDate];
                                if([date isEqual:strCurDate])
                                {
                                    highTemp = [[self stringForXPath:@"@high" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia] intValue];
                                    lowTemp = [[self stringForXPath:@"@low" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia] intValue];
                                }
                            }
                        }
                    }
                    else
                        continue;
                }

            }
      }
    }
    return self;
}

This is how I get the weather Details. In my case I only needed Location,Condition,High Temp,Low Temp,Current Temp.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top