Search code examples
objective-ciphoneios8cllocationmanagercllocation

Location is displayed once


I am just playing with CLLocation class. i successfully done the below code. When i press a button it displays the location in ALert msg. When i click the same button again the location is displayed wrongly. And also i have noted eveytime i have to go to Setting - Privacy -Location services to enable access always everytime. When ever the app shows the current location correctly the Location access in Setting of iPhone goes to Blank. again i have to set it to Always to run the app . I have not added anything in .plists. I have wrote just the below code. My problem is It is showing correct location only for the first time after setting location accress to Always

-(CLLocationCoordinate2D) getLocation{
        CLLocationCoordinate2D coordinate;


        if ([CLLocationManager locationServicesEnabled])
        {


        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        locationManager.distanceFilter = kCLDistanceFilterNone;
            [locationManager requestWhenInUseAuthorization];
        [locationManager startUpdatingLocation];



        CLLocation *location = [locationManager location];
        coordinate = [location coordinate];
        }
            return coordinate;

    }


    - (void)startTimer {

       // if ([Run isEqualToString:@"can"]) {

            i++;

            NSLog(@"the i value %d", i);

            Run =@"cant";
        CLLocationCoordinate2D coordinate = [self getLocation];

        CLGeocoder *ceo = [[CLGeocoder alloc]init];
        CLLocation *loc = [[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude]; //insert your coordinates

        [ceo reverseGeocodeLocation:loc
                  completionHandler:^(NSArray placemarks, NSError error)
         {
             CLPlacemark *placemark = [placemarks objectAtIndex:0];

             NSDictionary *eventLocation = [NSDictionary dictionaryWithObjectsAndKeys:placemark.name,@"NAME",placemark.subLocality,@"SUBLOCALITY" ,placemark.postalCode,@"POSTALCODE" ,nil];

           LocationDetails= [NSMutableDictionary dictionaryWithObjectsAndKeys:eventLocation,@"value", nil];


             NSString *name=placemark.name;
             NSString *subLocality=placemark.subLocality;
             NSString *postalCode=placemark.postalCode;



             NSMutableArray *listData;
             if (!listData) listData = [[NSMutableArray alloc] init];
             [listData addObject:LocationDetails];

             NSLog(@"the Location details %@", listData);

             NSString *location=[NSString stringWithFormat:@"You are now in %@ inside the sublocality of %@ and pin code is %@",name,subLocality,postalCode];


             UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"Location Update" message:location delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

             [Alert show];


         }

         ];

      //  }

        // contains the code you posted to start the timer
    }






    - (IBAction)getLocation:(id)sender {

        [ self startTimer];

    }

Solution

  • Instead of using your getLocation method, do all your CLLocationManager initializations when the class is initialized. In your @interface set a property to hold the user's current location:

    @property (nonatomic, strong) CLLocation *currentLocation;
    

    And implement the delegate method -locationManager:didUpdateLocations: like so:

    - (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations
    {
        // set the current location. The most recent location is always at the end of the
        // if there are multiple locations
        _currentLocation = locations[locations.count - 1];
    }
    

    Then, instead of CLLocationCoordinate2D coordinate = [self getLocation];, get the location with:

    CLLocationCoordinate2D coordinate = _currentLocation.coordinate; // I think that's the right property.
    

    Note: Make sure you class conforms to CLLocationManagerDelegate