iOS 개발 의 기본 적 인 포 지 셔 닝 기능 실현 설명
1.CLLocationManager
CLLocationManager 의 일반적인 동작 과 속성
사용자 포 지 셔 닝 시작-(void)startUpdatingLocation;
사용자 위치 정지-(void)stopUpdatingLocation;
설명:startUpdating Location 방법 을 호출 한 후에 사용자 의 위 치 를 계속 찾 기 시 작 했 고 중간 에 대리 의 아래 방법 을 자주 호출 할 것 입 니 다.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
몇 미터 간격 으로 한 번 씩 위 치 를 정 하 다.
@property(assign, nonatomic) CLLocationDistance distanceFilter;
포 지 셔 닝 정확도(정확 할 수록 전기 소모)
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
2.CLLocation
CLLocation 는 위도,해발 등 특정한 위치의 지리 정 보 를 나타 내 는 데 쓰 인 다.
(1)경위도
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
(2)해발
@property(readonly, nonatomic) CLLocationDistance altitude;
(3)노선,항행 방향(수치 범 위 는 0.0°~359.9°,0.0°는 진 북 방향 을 대표 한다)
@property(readonly, nonatomic) CLLocationDirection course;
(4)걷 는 속도(단 위 는 m/s)
@property(readonly, nonatomic) CLLocationSpeed speed;
(5)두 위치 사이 의 거 리 를 계산한다.
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
3.CLLocationCoordinate2D
CLLocationCoordinate2D 는 경 위 를 나타 내 는 구조 체 로 다음 과 같이 정의 합 니 다.
typedef struct {
CLLocationDegrees latitude; //
CLLocationDegrees longitude; //
} CLLocationCoordinate2D;
보통 CLLocationCoordinate2D Make 함수 로 CLLocationCoordinate2D 를 만 듭 니 다.
코드 예시
//
// YYViewController.m
// 18-
//
// Created by apple on 14-8-9.
// Copyright (c) 2014 yangyong. All rights reserved.
//
#import "YYViewController.h"
#import <CoreLocation/CoreLocation.h>
// CLLocationManagerDelegate
@interface YYViewController ()<CLLocationManagerDelegate>
@property(nonatomic,strong)CLLocationManager *locMgr;
@end
@implementation YYViewController
#pragma mark-
-(CLLocationManager *)locMgr
{
if (_locMgr==nil) {
//1. ( )
self.locMgr=[[CLLocationManager alloc]init];
//2.
self.locMgr.delegate=self;
}
return _locMgr;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//
if ([CLLocationManager locationServicesEnabled]) {
//
[self.locMgr startUpdatingLocation];
// ( )
self.locMgr.distanceFilter=kCLDistanceFilterNone;
// , , ( , )
self.locMgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
}else
{//
//1.
//2.
}
// ,
[self countDistance];
}
#pragma mark-CLLocationManagerDelegate
/**
* , ( )
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//locations CLLocation , CLLocation
CLLocation *loc = [locations firstObject];
// :loc.coordinate.latitude
// :loc.coordinate.longitude
NSLog(@" =%f, =%f",loc.coordinate.latitude,loc.coordinate.longitude);
NSLog(@"%d",locations.count);
// ( , )
// [self.locMgr stopUpdatingLocation];
}
//
-(void)countDistance
{
//
CLLocation *loc1=[[CLLocation alloc]initWithLatitude:40 longitude:116];
CLLocation *loc2=[[CLLocation alloc]initWithLatitude:41 longitude:116];
//
CLLocationDistance distance=[loc1 distanceFromLocation:loc2];
NSLog(@"(%@) (%@) =%fM",loc1,loc2,distance);
}
@end
인쇄 보기:코드 설명:
1.대리 방법 에 대하 여
프 록 시 를 설정 해 야 합 니 다.프 록 시 를 통 해 사용자 에 게 현재 위 치 를 알려 주 고 두 개의 프 록 시 방법 이 있 습 니 다.
locations 매개 변수 에 CLLocation 대상 이 들 어 있 습 니 다.
그 중에서 후 자 는 기한 이 지난 방법 으로 새로운 방법(첫 번 째)에서 하나의 배열 로 대체 했다.
설명:이 방법 은 사용자 의 위 치 를 찾 을 때 호출 되 고 호출 이 빈번 합 니 다.
메모:부분 변 수 를 사용 하지 마 십시오.부분 변 수 를 만 드 는 방법 이 끝나 면 삭 제 됩 니 다.전역 변 수 를 사용 하고 한 번 만 만 만 들 면 됩 니 다.(게 으 른 로 딩 사용)
2.포 지 셔 닝 의 정밀도
3.자신의 포 지 셔 닝 서비스 가 열 리 지 않 은 것 을 발견 하면 사용자 에 게 포 지 셔 닝 서비스 기능 을 켜 라 고 알려 야 한다.
4.포 지 셔 닝 서 비 스 는 전기 소모 가 많 습 니 다.포 지 셔 닝 서 비 스 를 하 는 경우(실시 간 으로 업데이트 할 필요 가 없다 면)사용자 의 위 치 를 정 한 후에 업데이트 위 치 를 중지 해 야 합 니 다.
3.사용자 의 프라이버시 보호
1.권한 설정 설명
iOS 6 부터 애플 은 사용자 의 프라이버시 를 보호 하 는 데 큰 강 화 를 했 고 다음 과 같은 조작 은 반드시 사용자 의 비준 을 거 쳐 권한 을 부여 해 야 한다.
(1)사용자 의 위 치 를 얻 으 려 면
(2)사용자 의 주소록,달력,카메라,앨범 등 을 방문 하고 싶 습 니 다.
사용자 의 프라이버시 정 보 를 방문 하려 면 시스템 에서 사용자 에 게 권한 을 부여 하 는 대화 상자 가 자동 으로 팝 업 됩 니 다.
메모:사용자 가'Don't Allow'를 선택 하면 애플 리 케 이 션 이후 포 지 셔 닝 기능 을 사용 할 수 없 음 을 의미 하 며 사용자 가 처음 선택 한 후에 다 시 는 설정 을 알 리 지 않 습 니 다.
따라서 프로그램 에서 자신의 포 지 셔 닝 서비스 가 열 리 지 않 은 것 을 발견 하면 사용자 에 게 포 지 셔 닝 서비스 기능 을 켜 라 고 알려 야 한다.
CLLocationManager 는 현재 응용 되 고 있 는 포 지 셔 닝 기능 이+(BOOL)locationServicesEnabled 를 사용 할 수 있 는 지 판단 할 수 있 는 방법 이 있 습 니 다.
자주 사용 하 는 방법:캡 처 를 통 해 사용자 에 게 인증 서 를 어떻게 열 어야 하 는 지 알려 줍 니 다.
2.개발 자 는 Info.plist 에 NSLocationUsage Description 을 설정 하여 포 지 셔 닝 의 목적 을 설명 할 수 있 습 니 다(Privacy-Location Usage Description)
설명:이곳 의 포 지 셔 닝 서 비 스 는 네트워크 를 바탕 으로 한다.일반적으로 포 지 셔 닝 서 비 스 는 GPS,기지 국 또는 네트워크 를 바탕 으로 할 수 있다.
4.iOS 8 이후 의 개선
iOS 8 은 보다 인간 적 인 포 지 셔 닝 서비스 옵션 도 제공한다.App 의 포 지 셔 닝 서 비 스 는 닫 거나 열 리 는 것 이 아 닙 니 다.현재 포 지 셔 닝 서비스의 사용 은 세 가지 옵션 을 제공 합 니 다.'영원히','응용 프로그램 을 사용 하 는 동안','항상'입 니 다.또한 에너지 소모 문 제 를 고려 하여 만약 에 앱 이 백 스테이지 에서 위치 추적 서 비 스 를 계속 시작 할 수 있 도록 요구한다 면 iOS 8 은 앱 을 처음 열 때 자발적으로 물 어 볼 뿐만 아니 라 일상적인 사용 에서 팝 업 창 은 앱 이 백 스테이지 에서 위치 추적 서 비 스 를 계속 사용 하 는 지 알려 주 고 계속 허용 하 는 지 물 어 볼 것 이다.iOS 7 및 이전 버 전에 서 는 프로그램 에서 포 지 셔 닝 서 비 스 를 사용 할 경우 프로그램 에서 startUpdatingLocation 방법 을 사용 하면 사용자 에 게 포 지 셔 닝 서 비 스 를 사용 할 수 있 는 지 여 부 를 물 어 볼 수 있 으 며,알림 과정 에서 info.plist 에 개인 정보-Location Usage 설정 을 통 해 사용 목적 을 알려 줄 수 있 습 니 다.동시에 이 설정 은 선택 할 수 있 습 니 다.
그러나 iOS 8 에서 설정 항목 이 바 뀌 었 습 니 다.NSLocationAlways Usage Description 이나 NSLocationWhenInUseUsage Description 을 설정 하여 사용자 에 게 포 지 셔 닝 서 비 스 를 사용 하 는 목적 을 알려 줄 수 있 습 니 다.또한 이 설정 이 필요 합 니 다.설정 을 하지 않 으 면 기본 적 인 상황 에서 포 지 셔 닝 서 비 스 를 사용 할 수 없습니다.응용 프로그램 을 열 면 포 지 셔 닝 서 비 스 를 여 는 힌트 를 주지 않 습 니 다.설치 후 이 앱 의 위치 추적 서 비 스 를 스스로 설정 하지 않 는 한또한 응용 프로그램 에 서 는 requestAlwaysAuthorization 이나 locationServicesEnabled 방법 을 설정 에 따라 요청 해 야 합 니 다.본인 의 기계 가 최신 iOS 8.1 로 업데이트 되 었 기 때문에 아래 의 내용 은 주로 iOS 8 을 대상 으로 하고 iOS 7 을 사용 하 는 친 구 는 약간 조정 해 야 합 니 다.
//
// KCMainViewController.m
// CoreLocation
//
// Created by Kenshin Cui on 14-03-27.
// Copyright (c) 2014 Kenshin Cui. All rights reserved.
//
#import "KCMainViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface KCMainViewController ()<CLLocationManagerDelegate>{
CLLocationManager *_locationManager;
}
@end
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
//
_locationManager=[[CLLocationManager alloc]init];
if (![CLLocationManager locationServicesEnabled]) {
NSLog(@" , !");
return;
}
//
if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){
[_locationManager requestWhenInUseAuthorization];
}else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){
//
_locationManager.delegate=self;
//
_locationManager.desiredAccuracy=kCLLocationAccuracyBest;
// ,
CLLocationDistance distance=10.0;//
_locationManager.distanceFilter=distance;
//
[_locationManager startUpdatingLocation];
}
}
#pragma mark - CoreLocation
#pragma mark , ( )
// ,
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location=[locations firstObject];//
CLLocationCoordinate2D coordinate=location.coordinate;//
NSLog(@" :%f, :%f, :%f, :%f, :%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
// ,
[_locationManager stopUpdatingLocation];
}
@end
주의:1.포 지 셔 닝 주파수 와 포 지 셔 닝 정밀도 가 정확 할 수록 좋 은 것 이 아니 라 실제 상황 에 따라 정 해 야 한다.정확 할 수록 성능 이 소모 되 고 전기 도 많이 들 기 때문이다.
2.포 지 셔 닝 성공 후 설정 상황 에 따라 자주 호출-(void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations 방법.이 방법 은 지리 적 위치 대상 배열 을 되 돌려 줍 니 다.각 요소 의 CLLocation 는 지리 적 위치 정보(경도,위도,포스터,걷 는 속도 등 정보 포함)를 대표 합 니 다.배열 로 돌아 가 는 이 유 는 한 위치 가 여러 위 치 를 포함 할 수 있 기 때문이다.
3.포 지 셔 닝 서 비 스 를 사용 한 후에 실시 간 모니터링 이 필요 하지 않 으 면 포 지 셔 닝 서 비 스 를 즉시 닫 아서 자원 을 절약 해 야 한다.
4.위치 추적 기능 을 제공 하 는 것 외 에 CLLocationManager 는 startMonitoringForRegion:방법 으로 지 정 된 구역 을 모니터링 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.