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

Другие вопросы по тегам