2014-02-09 5 views
3

Я создаю приложение, где мне нужно создать функциональность, которая гарантирует, что пользователь ходит (со своим iPhone) в одном направлении по прямой линии на 10 метров. Если пользователь принимает очередь, появляется предупреждение или что-то, чтобы получить уведомление.CLLocationManager перемещается в одном направлении по прямой линии

Может кто-нибудь, пожалуйста, руководство меня, как это сделать

ответ

1

после долгих исследований я ответить на этот вопрос сам.

#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; 
}  
0

Я бы хранить данные о местоположении и постоянно проверять каждый раз, если пользователь перемещается по линии. Здесь вы можете определить направление с первого, достаточно справедливого, 10 записей. Тогда вам нужно только проверить, не слишком ли отличается от него пользователь.

Расчет направления вы найдете здесь: http://forrst.com/posts/Direction_between_2_CLLocations-uAo

+0

Я делаю небольшую ошибку в своем answare: не первые 10 записей, но первые и десятые записи. –

+0

Я не могу понять, как это использовать! Мне нужно сделать подкласс CLLocation? – April

+0

Нет, в этом уроке используется класс категории. но вы также можете создать подкласс. И позже в вашем коде используйте это, чтобы вырезать угол. [code] double angle = [myCLLocation directionToLocation: otherLocation]; [/ code] CLLocationDirection - не более, чем глупый двойной. Таким образом, вы можете заменить CLLocationDirection просто двойным. –