CLLocationManager двигаться в одном направлении по прямой
Я создаю приложение, в котором мне нужно создать функциональность, которая обеспечит, чтобы пользователь шел (со своим iPhone) в одном направлении, следуя прямой линии в течение 10 метров. Если пользователь делает ход, всплывает предупреждение или что-то, чтобы получить уведомление.
Может кто-нибудь, пожалуйста, сообщите мне, как это сделать
2 ответа
После долгих исследований я отвечаю на этот вопрос сам.
#define kDistanceFilter 5
#define kRotationFilter 60
-(void)initInfluenceWalkingTest{
wasRotation = NO;
// Init and configure CLLocationManager
if (!self.locationManager) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.locationManager.distanceFilter = kDistanceFilter; // update location when user moves 5 meters
self.locationManager.headingFilter = kRotationFilter; // detect rotation if user rotates more than 60 degress
[self.locationManager startUpdatingLocation];
}
//Start heading updates (rotation)
if ([CLLocationManager headingAvailable]) {
[self.locationManager startUpdatingHeading];
}
//Init current location
if (!self.location) {
self.location = [[CLLocation alloc] init];
}
self.locations = [NSMutableArray array];
}
/*
* Invoked when new locations are available.
*/
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location = (CLLocation*)locations.lastObject;
//Filter location by time and accuracy
NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow];
if (locationAge > 5.0){
return;
}
if (location.horizontalAccuracy < 0)
return;
if (location.horizontalAccuracy>kDistanceFilter-1 && self.location.horizontalAccuracy<=kDistanceFilter) {
[self.locations addObject:location];
}
//Retain the object in a property
self.location = location;
//we show button when user stop moving
self.buttonTap.hidden = (self.location.speed>0);
}
/*
* Invoked when a new heading is available
*/
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
if (newHeading.headingAccuracy < 0)
return;
//Use the true heading
CLLocationDirection direction = ((newHeading.trueHeading > 0) ?
newHeading.trueHeading : newHeading.magneticHeading);
// Check if rotation was about 60 degrees
if (self.direction>0 && ABS(self.direction - direction)>kRotationFilter) {
wasRotation = YES;
}
//Retain the object in a property
self.direction = direction;
}
Я бы постоянно сохранял данные о местоположении и каждый раз проверял, перемещается ли пользователь по линии. Здесь вы можете определить направление из первых, достаточно честных, 10 записей. Тогда вам нужно только проверить, не слишком ли сильно отклоняется пользователь от него.
Расчет направления вы найдете здесь: http://forrst.com/posts/Direction_between_2_CLLocations-uAo