투케이2K

351. (ios/swift5) OperationQueue 와 @escaping 사용해 CLLocationManager 위치 권한 상태 응답 값 콜백 (callback) 확인 실시 본문

IOS

351. (ios/swift5) OperationQueue 와 @escaping 사용해 CLLocationManager 위치 권한 상태 응답 값 콜백 (callback) 확인 실시

투케이2K 2023. 10. 21. 18:54
반응형

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 
 

[소스 코드]

    // -----------------------------------------------------------------------------------------
    // MARK: - [위치 권한 부여 상태 확인 실시]
    // -----------------------------------------------------------------------------------------
    var checkLocationFlag = false
    private let locationOperationQueue = OperationQueue()
    var locationManager : CLLocationManager! // [위치 권한 상태 확인]
    
    func getLocationCheck(callback: @escaping (Bool) -> ()) {
        S_Log._D_(description: "위치 권한 부여 상태 확인 실시", data: nil)
        
        /*
        // -----------------------------------------
        // [getLocationCheck 메소드 설명]
        // -----------------------------------------
        1. 필요 info plist : 
         
         Privacy - Location Always and When In Use Usage Description
         Privacy - Location Always Usage Description
         Privacy - Location When In Use Usage Description
        // -----------------------------------------
        2. 필요 import 및 delegate :
         
         import CoreLocation
         
         CLLocationManagerDelegate
        // -----------------------------------------
        3. 호출 방법 :
         
         C_Permission().getLocationCheck(){(result) in
             
             S_Log._D_(description: "위치 권한 사용 여부 확인", data: ["\(result)"])
             
         }
         
        // -----------------------------------------
        4. 참고 퍼미션 요청 알림 : 현재 연결된 와이파이 정보를 확인하기 위해 위치 권한을 허용하시겠습니까?
        // -----------------------------------------
        */
        
        
        // [초기 플래그 값 초기화]
        self.checkLocationFlag = false
        
        
        // [작업 큐에 추가]
        self.locationOperationQueue.isSuspended = true
        let block = { callback(self.checkLocationFlag) }
        self.locationOperationQueue.addOperation(block)
        
        
        DispatchQueue.main.async {
         
            // [위치 권한 확인 실시]
            self.locationManager = CLLocationManager.init() // locationManager 초기화
            self.locationManager.delegate = self // 델리게이트 넣어줌
            //self.locationManager.allowsBackgroundLocationUpdates = true // MARK: 백그라운드 위치 업데이트 허용 [프로젝트 >> Signing & Capabilities 메뉴 >> 백그라운드 모드 >> 위치 업데이트 설정 한 경우]
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest // 거리 정확도 설정
            self.locationManager.requestAlwaysAuthorization() // 위치 권한 설정 값을 받아옵니다
            self.locationManager.startUpdatingLocation() // 위치 업데이트 시작
            
        }
        
    }
    
    
    
    
    
    
    // -----------------------------------------------------------------------------------------
    // MARK: - [위치 권한 부여 상태 응답 확인] : CLLocationManager : Delegate
    // -----------------------------------------------------------------------------------------
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        
        // -----------------------------------------
        if status == .authorizedAlways {
            S_Log._D_(description: "위치 권한 :: authorizedAlways :: 위치 사용 권한 항상 허용", data: nil)
            self.checkLocationFlag = true
            self.locationOperationQueue.isSuspended = false
        }
        // -----------------------------------------
        if status == .authorizedWhenInUse {
            S_Log._D_(description: "위치 권한 :: authorizedWhenInUse :: 위치 사용 권한 앱 사용 시 허용", data: nil)
            self.checkLocationFlag = true
            self.locationOperationQueue.isSuspended = false
        }
        // -----------------------------------------
        if status == .denied {
            S_Log._D_(description: "위치 권한 :: denied :: 위치 사용 권한 거부", data: nil)
            self.checkLocationFlag = false
            self.locationOperationQueue.isSuspended = false
        }
        // -----------------------------------------
        if status == .restricted {
            S_Log._D_(description: "위치 권한 :: restricted :: 위치 서비스를 사용할 권한이 없습니다", data: nil)
            self.checkLocationFlag = false
            self.locationOperationQueue.isSuspended = false
        }
        // -----------------------------------------
        if status == .notDetermined {
            S_Log._D_(description: "위치 권한 :: notDetermined :: 사용자가 앱에서 위치 서비스를 사용할 수 있는지 여부를 선택하지 않았습니다", data: nil)
        }
        // -----------------------------------------
        
    }
 

[결과 출력]

 

================================================================
LOG :: CLASS PLACE :: C_Permission.swift :: locationManager(_:didChangeAuthorization:) :: 511
-------------------------------------------------
LOG :: NOW TIME :: 2023-10-21 18:42:59
-------------------------------------------------
LOG :: DESCRIPTION :: authorizedAlways :: 위치 사용 권한 항상 허용
================================================================




================================================================
LOG :: CLASS PLACE :: A_Webview.swift :: viewDidLoad() :: 106
-------------------------------------------------
LOG :: NOW TIME :: 2023-10-21 18:42:59
-------------------------------------------------
LOG :: DESCRIPTION :: 위치 권한 사용 여부 확인
-------------------------------------------------
LOG :: true
================================================================

 

반응형
Comments