No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



CYLocationManager use CoreLocation Framework to track user travel distance.


  • iOS 5.0 or later
  • support ARC


Simply add CYLocationManager.h and CYLocationManager.m to your project, and import "CYLocationManager.h".

API and Parameters

Type Define

typedef enum {
    CYGPSSignalStrengthInvalid = 0,
} CYGPSSignalStrength;
  • GPS signal strength depend on the horizontalAccuracy of updated location. (see CLLocation.horizontalAccuracy).
  • you can change the parameters kRequiredHorizontalAccuracy and kMaxAcceptableHorizontalAccuracy in CYLocationManager.m to make the program determine the signal strength in a different way.
  • If the horizontalAccuracy of latest updated location is less then kRequiredHorizontalAccuracy, the GPS signal strength suppose to be strong, else it will be weak.


@interface CYLocationManager : NSObject

@property (nonatomic, weak) id<CYLocationManagerDelegate> delegate;
@property (nonatomic, readonly) CYGPSSignalStrength signalStrength;
@property (nonatomic, readonly) CLLocationDistance distance;

+ (CYLocationManager *)shareManager;

- (BOOL)prepareLocationUpdates;
- (BOOL)startLocationUpdates;
- (void)stopLocationUpdates;
- (void)resetLocationUpdates;

  • You should use the shareManager method to access the manager. However you also can alloc and init a new instance by yourself.
  • I recommend you set the delegate first before any operation, in order to get the callback when something you cared changed. However, you are not asked to do that, it's optional.
  • You should always prepareLocationUpdates first before you startLocationUpdates.
  • When you stopLocationUpdates, you could use startLocationUpdates to restart it, it won't reset the current calculation unless you use the resetLocationUpdates.
  • prepareLocationUpdates and startLocationUpdates will return a boolean value to determine whether it can do that. (Something like, GPS is not available and device can not connect the internet, or user reject your app to get his/her location)

Protocol callback methods

@protocol CYLocationManagerDelegate <NSObject>

- (void)locationManager:(CYLocationManager *)locationManager didUpdateSignalStrength:(CYGPSSignalStrength)signalStrength;
- (void)locationManagerSignalConsistentlyWeak:(CYLocationManager *)locationManager;
- (void)locationManager:(CYLocationManager *)locationManager didUpdateDistance:(CLLocationDistance)distance;
- (void)locationManager:(CYLocationManager *)locationManager didFailWithError:(NSError *)error;



  • Pretty straight forward, I'm sure your will know how to use them.
  • didFailWithError return the same error from CLLocationManager.


static const NSUInteger kDistanceFilter = 10;
static const NSUInteger kHeadingFilter = 30;
static const NSUInteger kNumberOfLocationsToKeep = 5;
static const NSUInteger kMinNumberOfLocationsRequiredToCalculate = 3;
static const NSUInteger kGPSSignalRecheckInterval = 15;
static const CGFloat kRequiredHorizontalAccuracy = 20.0;
static const CGFloat kRequiredHorizontalAccuracy = 70.0;
static const NSTimeInterval kCalculationInterval = 3;
static const NSTimeInterval kValidIntervalWithKeptLocation = 3;
static const NSUInteger kUpdateLocationMaxInterval = 10;


  • kDistanceFilter see CLLocationManager.distanceFilter
  • kHeadingFilter see CLLocationManager.headingFilter
  • kNumberOfLocationsToKeep, kMinNumberOfLocationsRequiredToCalculate: We keep multi location in order to pick up the datas which have the best accuracy to calculate the distance.
  • kGPSSignalRecheckInterval, interval of rechecking GPS Signal.
  • kRequiredHorizontalAccuracy, kRequiredHorizontalAccuracy: discussed in GPS signal strength.
  • kCalculationInterval: We calculate the distance kCalculationInterval seconds once.
  • kValidIntervalWithKeptLocation: The valid interval between current location and kept locations.
  • kUpdateLocationMaxInterval: if user stop walking or running, CoreLocation won't update the location, we need to force it to request a new location. It's mean we alway get a new location during kUpdateLocationMaxInterval seconds.

Contact Me