Monday, February 12, 2018

objective c - 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];

}

Answer



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


No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...