2012-12-02 5 views
0

나는 간단한 위치를지도해야하고 사용자가 원격 파일에 나열된 위치에 접근 할 때 나는 내 응용 프로그램의 경고음을 만들고 싶어- iOS 앱

나열된 위치가 locations.txt라는 내 서버에 있습니다.

사용자가 위치가 300m 이내인지 확인하려면 1 분마다 locations.txt를 어떻게 확인할 수 있습니까 ??

+0

[모양 기반 모니터링] (http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/)을 사용하는 것이 좋습니다. doc/uid/TP40009497-CH2-SW13) 대신 _Location Awareness Programming Guide_에서 논의되었습니다. 약간 다른 접근법이지만 기능적으로 원하는 것, 아마도보다 효율적인 배터리 사용으로 달성 할 수 있습니다. – Rob

+0

답장을위한 고맙습니다. 나는이 유형의 프로그래밍에 익숙하지 않고 이것을 사용하여 locations.txt를 확인하는 방법을 잘 모르고있다. 한 번에 많은 위치를 처리하지 못한다고 읽습니까? 약 90 개의 위치를 ​​처리 할 수 ​​있어야합니다. –

+0

그러면 해당 파일을 장치에 로컬로 캐시합니다. 수시로 업데이트 할 수 있습니다. –

답변

2

이 질문에 대한 표준 답변은 위치 인식 안내서에 설명 된대로 Shape-Based Regions입니다. 일반적으로 모양 기반 영역은 제한된 수의 영역이있는 경우 이동하는 방법입니다. 위치 서비스에

  • 를 켜고 사용자의 위치를 ​​모니터 :하지만, 당신이 지역의 많은 원하는 주어, 당신은 "자신의 롤"해야 할 수도 있습니다. Location Awareness Programming Guide을 참조하십시오. 표준 위치 서비스를 사용하는 경우 기능 요구 사항을 충족하려면 가능한 한 낮은 desiredAccuracy (예 : kCLLocationAccuracyHundredMeters)을 설정해야합니다.

  • 첫 번째 didUpdateLocations을 성공적으로 수신했으면 매분 확인하고 싶다면 그 시점에서 타이머를 만들 수 있습니다. 해당 타이머의 목적이 사용자의 위치를 ​​확인하는 것이라면 타이머는 실제로 필요하지 않으며 단지 didUpdateLocations의 발생을 기다릴 수 있습니다.

  • 당신은 모니터링 할 위치의 배열을 통해 반복 (내가 CLLocation 객체로 변환 것) 단순히 distanceFromLocation를 사용할 수 있습니다.

하지만 관찰의 커플 :

  • 당신은 사용자가 위치 300m 내에 있는지 확인하기 위해 locations.txt에게 매 순간을 확인하고자하는 것이 좋습니다. 당신이 솔루션을 제안 이유를 나는 두 가지 이유를 상상할 수 :

    • 서버의 locations.txt 변화를 했습니까? 이것이 문제를 해결하려는 경우 더 좋은 해결책은 push notifications (a.k.a. "원격 알림")이며 클라이언트가 최신 정보에 액세스 할 수 있도록하려는 것입니다. 끊임없이 파일을 다시 검색하는 프로세스는 매우 비쌉니다 (대역폭, 배터리, 계산적으로). 또는

    • 사용자가 이동 했습니까? 사용자가 이동했는지 여부가 염려된다면 적절한 해결책은 매분마다 확인하는 것이 아니라 [CLLocationManagerDelegate] 인스턴스 메서드 didUpdateLocations이 호출 될 때까지 기다리는 것입니다. 너무 많은 중복 검사를 피하려면 마지막 요청이 1 분 미만인지 여부를 항상 추적하고 1 분 전 이상인지 다시 확인하십시오. 그러나 그것은 당신이 필요로하는지 여부와 상관없이 매분마다 점검하는 것과는 매우 다릅니다.

  • 텍스트 파일 사용을 제안했습니다. 서버에서 데이터를 검색하는 더 나은 메커니즘 인 JSON 파일 (또는 XML 파일)을 사용하려고 계획 할 수 있습니다.당신이 JSON 형식의 텍스트 파일이있는 경우


는 예를 들어, 코드 ( JSONObjectWithData)의 또 다른 한 줄의 결과를 분석 할 수 있습니다.

다음
[ 
    { 
    "name" : "Battery Park", 
    "latitude" : 40.702, 
    "longitude" : -74.015 
    }, 
    { 
    "name" : "Grand Central Station", 
    "latitude" : 40.753, 
    "longitude" : -73.977 
    } 
] 

앱이 : 설명하기 위해, JSON 파일이 어떻게 보이는지 내가 당신을 보여 드리죠 (대괄호가 배열을 지정하고 중괄호가 사전을 지정할 경우,이 때문에 사전의 배열입니다) 두 개의 선으로 믿을 수 없을만큼 쉽게 결과를 검색 할 수 있습니다 : 당신은 다음 t을 점검하기위한 루틴을해야합니다

if (nil == self.locationManager) 
    self.locationManager = [[CLLocationManager alloc] init]; 

self.locationManager.delegate = self; 
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; 

// Set a movement threshold for new events. 
self.locationManager.distanceFilter = 500; 

[self.locationManager startUpdatingLocation]; 

: 그래서

NSData *locationsData = [NSData dataWithContentsOfURL:url]; 
NSArray *locationsArray = [NSJSONSerialization JSONObjectWithData:locationsData options:0 error:&error]; 

, 당신은 위치 서비스를 시작해야합니다 그는 현재 위치 :

- (void)checkLocation 
{ 
    NSURL *url = [NSURL URLWithString:kLocationsUrlString]; 
    NSData *locationsData = [NSData dataWithContentsOfURL:url]; 
    NSAssert(locationsData, @"failure to download data"); // replace this with graceful error handling 

    NSError *error; 
    NSArray *locationsArray = [NSJSONSerialization JSONObjectWithData:locationsData 
                   options:0 
                   error:&error]; 
    NSAssert(locationsArray, @"failure to parse JSON"); // replace with with graceful error handling 

    for (NSDictionary *locationEntry in locationsArray) 
    { 
     NSNumber *longitude = locationEntry[@"longitude"]; 
     NSNumber *latitude = locationEntry[@"latitude"]; 
     NSString *locationName = locationEntry[@"name"]; 

     CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude doubleValue] 
                  longitude:[longitude doubleValue]]; 
     NSAssert(location, @"failure to create location"); 

     CLLocationDistance distance = [location distanceFromLocation:self.locationManager.location]; 

     if (distance <= 300) 
     { 
      NSLog(@"You are within 300 meters (actually %.0f meters) of %@", distance, locationName); 
     } 
     else 
     { 
      NSLog(@"You are not within 300 meters (actually %.0f meters) of %@", distance, locationName); 
     } 
    } 
} 

그리고 사용자의 위치 변경 될 때 호출됩니다

// this is used in iOS 6 and later 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    [self checkLocation]; 
} 

// this is used in iOS 5 and earlier 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0) 
     [self checkLocation]; 
} 

이 구현은 this test project on GitHub처럼 보일 수 있습니다. 이것은 베어 본 구현이지만 직접 얻은 도구에 대한 아이디어를 제공합니다. 즉, locations.json 파일을 검색하고이를 장치에서 검색 한 위치와 비교합니다.

+0

죄송합니다.이 작업을 수행하는 방법에 대해 약간의 확신이 없으므로 지금까지 저는 {{{ NSArray * locationsArray;} @property (nonatomic, strong) NSArray * locationsArray;와'@synthesize locationsArray;'캐시 된 파일을 검사하고 위치를 확인할 때마다 다운로드하려고하지 않는 방법을 잘 모르겠습니다. ?? –

+0

좋아, 그냥 @property 줄을 사용하는 경우 self.locationsArray 함께 모든 locationsArray 바꿀 필요가? 당신이 안드로이드 플랫폼을위한이 코드를 도울 수 있는지 궁금합니다. –

+0

괜찮습니다. 다음 질문은 사용자가 300m 이내에있을 때 삐 소리를내는 방법입니다. 이 [여기 링크] (http://www.raywenderlich.com/259/audio-101-for-iphone-developers-playing-audio-programmatically)가 올바른 방향으로 나를 가리키고 있을까요? –