코어 위치 포 지 셔 닝

CoreLocation은 iOS 에서 장치 위 치 를 제공 하 는 프레임 워 크 입 니 다.이 프레임 워 크 를 통 해 포 지 셔 닝 처 리 를 실현 하고 위치 데 이 터 를 얻 을 수 있 습 니 다.위치 데 이 터 는 보통 경도,위도,해발 정보 등 을 포함한다.
iOS 8 시스템 에서 포 지 셔 닝 서 비 스 를 사용 하려 면info.plist파일 에 두 개의 변수NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription를 추가 해 야 합 니 다.이 두 키 의 값 은 응용 프로그램의 시종 사용 과 사용 기간 에 포 지 셔 닝 을 사용 하 는 설명 에 사 용 됩 니 다.NSLocationAlwaysUsageDescriptionString 응용 프로그램 은 항상 포 지 셔 닝 서 비 스 를 사용 합 니 다.NSLocationWhenInUseUsageDescriptionString 이 프로그램 을 사용 하 는 동안 위치 추적 서 비 스 를 사용 할 수 있 습 니 다.
CLLocationManager 속성 과 방법
속성 명
묘사 하 다.
location:CLLocation
위치.
desiredAccuracy:CLLocationAccuray
위치 정밀도
func startUpdatingLocation()
업데이트 위치 열기
func stopUpdatingLocation()
위치 업데이트 중지
func startUpdatingHeading()
업데이트 방향 열기
func stopUdatingHeading()
업데이트 중지 방향
정밀도 의 6 가지 선택
desired 정확도 속성
묘사 하 다.let kCLLocationAccuracyBestForNavigation: CLLocationAccuracy
정밀도 가 가장 높 아 일반적으로 내 비게 이 션 에 쓰 인 다.let kCLLocationAccuracyBest: CLLocationAccuracy
정밀도 가 가장 좋다.let kCLLocationAccuracyNearestTenMeters: CLLocationAccuracy
정확도 10 미터 이내let kCLLocationAccuracyHundredMeters: CLLocationAccuracy
정확도 100 미터 내let kCLLocationAccuracyKilometer: CLLocationAccuracy
정확도 1000 미터 내let kCLLocationAccuracyThreeKilometers: CLLocationAccuracy
정확도 3000 미터 내
관리자 가 업 데 이 트 를 시작 하면 업 데 이 트 는 업데이트 가 끝 날 때 까지 위치 관리자 에 게 계속 전 달 됩 니 다.위치 관리자 가 업데이트 하 는 빈 도 를 직접 제어 할 수 는 없 지만 위치 관리자 의distanceFilter속성 으로 간접 적 으로 제어 할 수 있 습 니 다.업 데 이 트 를 시작 하기 전에 속성distanceFilter을 설정 합 니 다.장치 가 몇 미터 이동 해 야 다른 업 데 이 트 를 의뢰 에 보 낼 수 있 는 지 지정 합 니 다.포 지 셔 닝 요구 의 정밀도 가 높 을 수록 속성distanceFilter의 값 이 작 을 수록 응용 프로그램의 전력 소비량 이 커진다.그의 단 위 는 쌀 이 므 로 우 리 는 직접 정형 숫자 를 사용 하여 이 거 리 를 설정 할 수 있다.
locationManager.distanceFilter = 200

사용자 권한 부여
권한 수여 신청 을 하면 장치 에서 알림 이 뜨 고 사용자 에 게 위치 추적 서 비 스 를 사용 할 수 있 도록 요청 합 니 다.코드 는 다음 과 같 습 니 다:
locationManager.requestAlwaysAuthorization()
didChangeAuthorizationStatus에이전트 방법 을 통 해 장치 가 포 지 셔 닝 서 비 스 를 사용 할 수 있 는 지 여 부 를 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
func locationManager(_ manager: CLLocationManager,
 didChangeAuthorizationStatus status: CLAuthorizationStatus){
   if status == .NotDetermined || status == .Denied{
     //        

     //          
     locationManager.startUpdatingLocation()

     print("    ")
   }
 }
startUpdatingLocation방법 으로 포 지 셔 닝 관 리 를 시작 합 니 다.만약 에 우리 가 포 지 셔 닝 을 업데이트 할 필요 가 없 을 때stopUpdatingLocation방법 으로 포 지 셔 닝 관 리 를 닫 으 면 전 기 를 절약 할 수 있 습 니 다.locationManager.stopUpdatingLocation()
의뢰 류CLLocationManagerDelegate에 가장 많이 사용 되 는 방법 은:
func locationManager(_ manager: CLLocationManager,
           didUpdateLocations locations: [CLLocation])

위치 변경 시 이 방법 을 의뢰 하면 새로운 위치,낡은 위 치 를 얻 을 수 있 습 니 다.location 배열 에는 앞 뒤 위치의 경도 위도 좌표 값 이 있 습 니 다.
func locationManager(_ manager: CLLocationManager,
           didUpdateLocations locations: [CLLocation]){
             var currlocation:CLLocation
             //      
             currlocation = locations.last as! CLLocation
             //    
             currlocation.coordinate.longitude
             //    
             currlocation.coordinate.latitude
             //    
             currlocation.altitude
           }

CLLocation 대상 은 포 지 셔 닝 포인트 와 관련 된 위치 데 이 터 를 포함 하고 경도,위도,해발 정보 가 있 으 며 속성 과 방법 을 통 해 얻 을 수 있 습 니 다.
CLLocation 속성 및 방법
속성 명
기능.
var coordinate: CLLocationCoordinate2D { get }
위치의 위도 와 경도
var altitude: CLLocationDistance { get }
위치 해발
var horizontalAccuracy: CLLocationAccuracy { get }
위치의 수평 정밀도
var verticalAccuracy: CLLocationAccuracy { get }
위치 수직 정밀도
var speed: CLLocationSpeed { get }
위치의 방향
var course: CLLocationDirection { get }
위치의 속도
func distanceFromLocation(_ location: CLLocation) -> CLLocationDistance
두 자리 사이 의 거리
사용`func locationManager(manager: CLLocationManager,
         didUpdateHeading newHeading: CLHeading)`            。  `newHeading`   CLHeading  。CLHeading             :
magneticHeadingtrueHeading.이 값 의 단 위 는 도 이다.유형 은CLLocationDirection,즉 쌍 정밀도 부동 소수점 이다.이것 은:
만약 항행 방향 이 0.0 이 라면,전진 방향 은 북 이다.
만약 항행 방향 이 90.0 이 라면,전진 방향 은 동쪽 이다.
만약 항행 방향 이 180.0 이 라면,전진 방향 은 남쪽 이다.
만약 항행 방향 이 270.0 이 라면,전진 방향 은 서쪽 이다.magneticHeadingtrueHeading는 각각 자성 항 로 를 나타 내 고 실제 항 로 를 나타 낸다.위치 서비스 가 닫 히 면 GPS 와 와 와 이 파 이 는 자장 항 로 를 얻 을 수 밖 에 없다.위치 서 비 스 를 열 어야 실제 항 로 를 얻 을 수 있 습 니 다.
프 록 시 를 사용 하기 전에 업데이트 방향 을 켜 야 합 니 다:locationManager.startUpdatingHeading()
CLHeading 속성
속성 명
묘사 하 다.
magneticHeading
위치의 자극 방향
trueHeading
위치의 실제 방향
headingAccuracy
방향 경도
timestamp
타임 스탬프
description
방향 데이터 가 져 오기
CLError
위치 추적 에 실 패 했 을 때 의뢰 방법 을 호출 합 니 다.
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
       //              
       if let clerr = CLError(rawValue: error.code){

       }
   }

//CLError          

public enum CLError : Int {

    case LocationUnknown // location is currently unknown, but CL will keep trying  
                         //      ,     
    case Denied // Access to location or ranging has been denied by the user
                //            
    case Network // general, network-related error
                //    
    case HeadingFailure // heading could not be determined
                        //         ,    
    case RegionMonitoringDenied // Location region monitoring has been denied by the user
                                //          
    case RegionMonitoringFailure // A registered region cannot be monitored
                                //       
    case RegionMonitoringSetupDelayed // CL could not immediately initialize region monitoring
                                      //        
    case RegionMonitoringResponseDelayed // While events for this fence will be delivered, delivery will not occur immediately
    //         
    case GeocodeFoundNoResult // A geocode request yielded no result
    //       
    case GeocodeFoundPartialResult // A geocode request yielded a partial result
    //            
    case GeocodeCanceled // A geocode request was cancelled
    //          
    case DeferredFailed // Deferred mode failed
    //      
    case DeferredNotUpdatingLocation // Deferred mode failed because location updates disabled or paused
    //            ,      
    case DeferredAccuracyTooLow // Deferred mode not supported for the requested accuracy
    //           
    case DeferredDistanceFiltered // Deferred mode does not support distance filters
    //             
    case DeferredCanceled // Deferred mode request canceled a previous request
    //       
    case RangingUnavailable // Ranging cannot be performed
    //      
    case RangingFailure // General ranging failure
    //      
}

더 많은 에이전트 방법 은 문 서 를 보십시오.
지리 정보 반 코딩
코어 로 케 이 션 류 를 통 해 얻 는 지위 정 보 는 모두 경도 와 위도 등 으로 표시 되 는 지리 정보 다.일반적으로 인 코딩 도시 의 주 소 를 되 돌려 야 한다.
이것 은 지리 정보의 반 코딩 을 실현 하기 위해CLGeocoder클래스 가 필요 하 다
iOS 9 새로운 기능 이 더욱 유연 한 배경 포 지 셔 닝(발췌)
배경 위치 지정 권한 요청:
방법 1
// 1.         
_locationManager = [[CLLocationManager alloc] init];
// 2.     
_locationManager.delegate = self;
// 3.     
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
// 4.      :
//  :
//⓵        
//⓶       ,
//  :     ⓵ ⓶    ,         ,   ⓶  ,
//⓵⓶     ,   bug:        ,      ⓵   ,⓶         ,             ⓶


if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
    //[_locationManager requestWhenInUseAuthorization];//⓵        
    [_locationManager requestAlwaysAuthorization];//⓶       
}

// 5.iOS9   :         :  app   location manager:         ,         (           )。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

// 6.       
[_locationManager startUpdatingLocation];

대응 하 는 Info.plist 의 XML 소스 코드 는:
NSLocationAlwaysUsageDescription
        

UIBackgroundModes

    location

방법 2:
target 에 대응 하 는 Capabilities->Background Modes->Location Updates 열기
예:
typealias CoreLocationdelegate = ViewController

extension CoreLocationdelegate:CLLocationManagerDelegate{
   func configLocation(){
       //1 the location manager
       let locationManager = CLLocationManager()
       //2 setting the desired accuracy
       locationManager.delegate = self
       locationManager.desiredAccuracy = kCLLocationAccuracyBest
       //3 setting the distance filter
       locationManager.distanceFilter = 1000
       //4 getting permission to use location services
       locationManager.requestAlwaysAuthorization()
       //5 starting the location manager


   }


   func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
     //              
      if status == CLAuthorizationStatus.Denied || status == CLAuthorizationStatus.NotDetermined{
         locationManager.requestAlwaysAuthorization()
      }else{
          //          ,        
          locationManager.startUpdatingLocation()
          //        
          locationManager.startUpdatingHeading()
      }
   }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
       //       
       let theLocation = locations.last
       //    
       let latitude = theLocation?.coordinate.latitude
       //    
       let longitude = theLocation?.coordinate.longitude

       //    

       let altitude = theLocation?.altitude

   }


   func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
       //              
       if let clerr = CLError(rawValue: error.code){

       }
   }

   func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
       //           


   }

좋은 웹페이지 즐겨찾기