나는 간단한 위치를지도해야하고 사용자가 원격 파일에 나열된 위치에 접근 할 때 나는 내 응용 프로그램의 경고음을 만들고 싶어- iOS 앱
나열된 위치가 locations.txt라는 내 서버에 있습니다.
사용자가 위치가 300m 이내인지 확인하려면 1 분마다 locations.txt를 어떻게 확인할 수 있습니까 ??
나는 간단한 위치를지도해야하고 사용자가 원격 파일에 나열된 위치에 접근 할 때 나는 내 응용 프로그램의 경고음을 만들고 싶어- iOS 앱
나열된 위치가 locations.txt라는 내 서버에 있습니다.
사용자가 위치가 300m 이내인지 확인하려면 1 분마다 locations.txt를 어떻게 확인할 수 있습니까 ??
이 질문에 대한 표준 답변은 위치 인식 안내서에 설명 된대로 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
파일을 검색하고이를 장치에서 검색 한 위치와 비교합니다.
죄송합니다.이 작업을 수행하는 방법에 대해 약간의 확신이 없으므로 지금까지 저는 {{{ NSArray * locationsArray;} @property (nonatomic, strong) NSArray * locationsArray;와'@synthesize locationsArray;'캐시 된 파일을 검사하고 위치를 확인할 때마다 다운로드하려고하지 않는 방법을 잘 모르겠습니다. ?? –
좋아, 그냥 @property 줄을 사용하는 경우 self.locationsArray 함께 모든 locationsArray 바꿀 필요가? 당신이 안드로이드 플랫폼을위한이 코드를 도울 수 있는지 궁금합니다. –
괜찮습니다. 다음 질문은 사용자가 300m 이내에있을 때 삐 소리를내는 방법입니다. 이 [여기 링크] (http://www.raywenderlich.com/259/audio-101-for-iphone-developers-playing-audio-programmatically)가 올바른 방향으로 나를 가리키고 있을까요? –
[모양 기반 모니터링] (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
답장을위한 고맙습니다. 나는이 유형의 프로그래밍에 익숙하지 않고 이것을 사용하여 locations.txt를 확인하는 방법을 잘 모르고있다. 한 번에 많은 위치를 처리하지 못한다고 읽습니까? 약 90 개의 위치를 처리 할 수 있어야합니다. –
그러면 해당 파일을 장치에 로컬로 캐시합니다. 수시로 업데이트 할 수 있습니다. –