투케이2K

324. (ios/swift) CLLocation , CLGeocoder 사용해 실시간 사용자 위도 , 경도 및 주소 정보 확인 실시 본문

IOS

324. (ios/swift) CLLocation , CLGeocoder 사용해 실시간 사용자 위도 , 경도 및 주소 정보 확인 실시

투케이2K 2022. 11. 25. 13:09
반응형

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[사전 설정]

 

[소스 코드]

import UIKit
import Foundation
import AVKit
import AVFoundation

// MARK: [import 선언 실시]
import CoreLocation

class A_Intro: UIViewController, CLLocationManagerDelegate {
    
    
    // MARK: - [전역 변수 선언 실시]
    let ACTIVITY_NAME = "A_Intro"
    
    var locationManager : CLLocationManager! // [위치 권한 사용 매니저]
    
    
    
    
    
    // MARK: - [뷰 로드 실시]
    override func viewDidLoad() {
        super.viewDidLoad()
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> viewDidLoad() :: 뷰 로드 실시]")
        print("====================================")
        print("")
        
        // [테스트 함수 실행 실시]
        self.testMain()
    }
    
    
    
    
    
    // MARK: - [뷰 로드 완료]
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> viewWillAppear() :: 뷰 로드 완료]")
        print("====================================")
        print("")
    }
        
    
    
    
    
    // MARK: - [뷰 화면 표시]
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> viewDidAppear() :: 뷰 화면 표시]")
        print("====================================")
        print("")
        
    }
        
    
    
    
    
    // MARK: - [뷰 정지 상태]
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> viewWillDisappear() :: 뷰 정지 상태]")
        print("====================================")
        print("")
    }
        
    
    
    
    
    // MARK: - [뷰 종료 상태]
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> viewDidDisappear() :: 뷰 종료 상태]")
        print("====================================")
        print("")
    }
    
    
    
    
    
    
    // MARK: - [테스트 메인 함수 정의 실시]
    func testMain() {
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> testMain() :: 테스트 함수 시작 실시]")
        print("====================================")
        print("")
        
        
        /*
         -------------------------------
         [요약 설명]
         -------------------------------
         1. 필요 info plist 설정 :
         
         Privacy - Location Always Usage Description
         Privacy - Location Always and When In Use Usage Description
         Privacy - Location When In Use Usage Description
         -------------------------------
         2. 필요 import 설정 :
         
         import CoreLocation
         -------------------------------
         */
        
        
        // [로직 처리 수행]
        DispatchQueue.main.async {
            
            self.locationManager = CLLocationManager.init() // locationManager 초기화
            self.locationManager.delegate = self // 델리게이트 넣어줌
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest // 거리 정확도 설정
            self.locationManager.requestAlwaysAuthorization() // 위치 권한 설정 값을 받아옵니다

            self.locationManager.startUpdatingLocation() // 위치 업데이트 시작

        }

    }
    
    
    
    
    
    // MARK: - [위치 서비스에 대한 권한 확인 실시]
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == .authorizedAlways {
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> locationManager() :: 위치 사용 권한 항상 허용]")
            print("====================================")
            print("")
        }
        if status == .authorizedWhenInUse {
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> locationManager() :: 위치 사용 권한 앱 사용 시 허용]")
            print("====================================")
            print("")
        }
        if status == .denied {
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> locationManager() :: 위치 사용 권한 거부]")
            print("====================================")
            print("")
        }
        if status == .restricted || status == .notDetermined {
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> locationManager() :: 위치 사용 권한 대기 상태]")
            print("====================================")
            print("")
        }
    }
    
    
    
    
    
    // MARK: - [위치 정보 지속적 업데이트]
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            // [위치 정보가 nil 이 아닌 경우]
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> didUpdateLocations() :: 위치 정보 확인 실시]")
            print("위도 : \(location.coordinate.latitude)")
            print("경도 : \(location.coordinate.longitude)")
            print("====================================")
            print("")
            
            
            // [주소 정보 확인 메소드 호출]
            self.addressInfo(lati: location.coordinate.latitude, longi: location.coordinate.longitude)
        }
    }
    
    
    
    
    
    // MARK: - [위도, 경도 받아오기 에러가 발생한 경우]
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> didFailWithError() :: 위치 정보 확인 에러]")
        print("error : \(error)")
        print("localizedDescription : \(error.localizedDescription)")
        print("====================================")
        print("")
    }
    
    
    
    
    
    // MARK: - [위도 , 경도를 사용해 주소 확인 실시]
    func addressInfo(lati:CLLocationDegrees, longi:CLLocationDegrees){
        let findLocation = CLLocation(latitude: lati, longitude: longi )
        let geocoder = CLGeocoder()
        let locale = Locale(identifier: "Ko-kr") // [나라 코드 설정]
        
        geocoder.reverseGeocodeLocation(findLocation, preferredLocale: locale, completionHandler: {(placemarks, error) in
            
            if error != nil {
                print("")
                print("====================================")
                print("[\(self.ACTIVITY_NAME) >> addressInfo() :: 주소 정보 확인 에러]")
                print("error : \(error?.localizedDescription)")
                print("====================================")
                print("")
            }
            else {
                if let address: [CLPlacemark] = placemarks {
                    
                    print("")
                    print("====================================")
                    print("[\(self.ACTIVITY_NAME) >> addressInfo() :: 주소 정보 확인 실시]")
                    print("country : \(address.last?.country ?? "")")
                    print("administrativeArea : \(address.last?.administrativeArea ?? "")")
                    print("locality : \(address.last?.locality ?? "")")
                    print("name : \(address.last?.name ?? "")")
                    print("====================================")
                    print("")
                }
            }
            
        })
         
    }
    
    
} // [클래스 종료]
 

[결과 출력]


반응형
Comments