2
votes

Currently I am working in a project , its requirement is to get the current location information specially latitude and longitude value in every 200m interval using wifi network or Cellular network without using gps as it is consuming more battery life.

Is this possible in ios latest version .

If any one having any idea ,please share with me , Thank you.

6
Im not sure if you can get the users location using the Cellular network without using gpsWill

6 Answers

1
votes

Have a look in to CLLocationManager, That will be able to tell you where the user is located.

.h

#import <CoreLocation/CoreLocation.h>
@property(nonatomic,retain) CLLocationManager *locationManager;

.m

- (void)viewDidLoad
{
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;

        //let the user know the purpose
        locationManager.purpose = @"Enable location services";
        locationManager.distanceFilter = kCLDistanceFilterNone;
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
        NSLog(@"User latitude: %f",locationManager.location.coordinate.latitude);
        NSLog(@"User longitude: %f",locationManager.location.coordinate.longitude);

        [locationManager startUpdatingLocation];
}
1
votes

It only way to get your location info in every 200m that is CLLocationManager's startUpdatingLocation. But it is comsuming a lot of battery.

But there is a little different way to get your location when it is changed.

CLLocationManager's startMonitoringSignificantLocationChanges.

Here is a Link

1
votes

The location manager protocol reference

https://developer.apple.com/library/mac/#documentation/CoreLocation/Reference/CLLocationManagerDelegate_Protocol/CLLocationManagerDelegate/CLLocationManagerDelegate.html

1.In Appdelegate

#import <CoreLocation/CoreLocation.h>

In @interface file

CLLocationManager *locationManager;
@property (nonatomic, retain) CLLocationManager *locationManager;

and add protocol CLLocationManagerDelegate protocol.

2.Impliment these functions in .m.

@synthesize locationManager;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{   
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];  
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = 1.0;
    [self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
  // Show an alert or otherwise notify the user
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
}
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
{
}

Note:If you want to debug first set current location in simulator At Debug--->Location--->Custom Location.

0
votes

its requirement is to get the current location information specially latitude and longitude value in every 200m interval using wifi network or Cellular network without using gps as it is consuming more battery life

The documentation for CLLocationManager has this to say about distance and the GPS hardware:

... setting the desired accuracy for location events to one kilometer gives the location manager the flexibility to turn off GPS hardware and rely solely on the WiFi or cell radios.

For less than 200 meters you'll probably need to roll-your-own solution here.

0
votes
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {


[locationManager stopUpdatingLocation];
[locationManager stopMonitoringSignificantLocationChanges];    
[self performSelector:@selector(stopUpadateLocation)];


CLLocation *location = [locationManager location];
CLLocationCoordinate2D coord;
coord=[location coordinate];
NSLog(@"coord %f %f", coord.latitude, coord.longitude);
NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%f,%f&output=json", newLocation.coordinate.latitude, newLocation.coordinate.longitude];

NSURL *url = [NSURL URLWithString:urlString];
NSString *locationString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

NSDictionary *dic=[locationString JSONValue];
NSLog(@"locationString:%@",locationString );
[strAddr setString:[AppUtility removeNull:[NSString stringWithFormat:@"%@",[[[dic valueForKey:@"Placemark"] objectAtIndex:0] valueForKey:@"address"]]]];
[txtNear setText:strAddr];

}

- (void)startUpdateLocation{
[locationManager startUpdatingLocation];

}

- (void)stopUpadateLocation{
[locationManager stopUpdatingLocation];
[locationManager stopMonitoringSignificantLocationChanges];

}

0
votes

You have to use the Core Location method startMonitoringSignificantLocationChanges which uses only the wifi or cellular networks!