투케이2K

18. (TWOK/UTIL) [Ios/Swift] C_Permission - 모바일 퍼미션 권한 관리 클래스 본문

투케이2K 유틸파일

18. (TWOK/UTIL) [Ios/Swift] C_Permission - 모바일 퍼미션 권한 관리 클래스

투케이2K 2022. 3. 24. 15:54

[설 명]

프로그램 : Ios / Swift

설 명 : 모바일 퍼미션 권한 관리 클래스

 

[소스 코드]

 

// -----------------------------------------
import Foundation
import UIKit
// -----------------------------------------
//MARK: [카메라 및 앨범, 마이크 접근]
import AVFoundation
import Photos
// -----------------------------------------


class C_Permission {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. 모바일 퍼미션 권한 관리 클래스
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [포토 앨범 퍼미션 권한 확인 실시]
    var checkPhotoFlag = false
    func getPhotoAuthCheck() -> Bool {
        print("")
        print("====================================")
        print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 요청 실시]")
        print("====================================")
        print("")
        
        /*
        // -----------------------------------------
        // [getPhotoAuthCheck 메소드 설명]
        // -----------------------------------------
        1. 필요 info plist : Privacy - Photo Library Usage Description
        // -----------------------------------------
        2. 필요 import : import AVFoundation , import Photos
        // -----------------------------------------
        3. 호출 방법 : if C_Permission().getPhotoAuthCheck() == true {} else {}
        // -----------------------------------------
        4. 참고 퍼미션 요청 알림 : 게시물 업로드를 위해 앨범 접근 권한이 필요합니다. 허용하시겠습니까?
        // -----------------------------------------
        5. 주요 참고 : 뷰 컨트롤러 viewDidAppear 뷰 화면 표시 , 포그라운드 상태에서 요청 수행 실시
        // -----------------------------------------
        */
        
        // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
        let semaphore = DispatchSemaphore(value: 0)
        
        // [앨범의 사진에 대한 접근 권한 확인 실시]
        PHPhotoLibrary.requestAuthorization( { status in
            switch status{
            case .authorized:
                print("")
                print("====================================")
                print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
                print("상태 :: 앨범 권한 허용")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkPhotoFlag = true
                
                // [세마포어 신호 알림]
                semaphore.signal()
                break
                
            case .denied:
                print("")
                print("====================================")
                print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
                print("상태 :: 앨범 권한 거부")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkPhotoFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
                break
                
            case .notDetermined:
                print("")
                print("====================================")
                print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
                print("상태 :: 앨범 권한 선택하지 않음")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkPhotoFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
                break
                
            case .restricted:
                print("")
                print("====================================")
                print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
                print("상태 :: 앨범 접근 불가능, 권한 변경이 불가능")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkPhotoFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
                break
                
            default:
                print("")
                print("====================================")
                print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
                print("상태 :: default")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkPhotoFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
                break
            }
        })
        
        // [세마포어 확인 대기]
        semaphore.wait()
        
        print("")
        print("====================================")
        print("[C_Permission >> getPhotoAuthCheck() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
        print("return :: \(self.checkPhotoFlag)")
        print("====================================")
        print("")
        
        // [결과 리턴 실시]
        return self.checkPhotoFlag
    }
    
    
    
    
    
    // MARK: - [카메라 퍼미션 권한 확인 실시]
    var checkCameraFlag = false
    func getCameraAuthCheck() -> Bool {
        print("")
        print("====================================")
        print("[C_Permission >> getCameraAuthCheck() :: 카메라 접근 권한 요청 실시]")
        print("====================================")
        print("")
        
        /*
        // -----------------------------------------
        // [getCameraAuthCheck 메소드 설명]
        // -----------------------------------------
        1. 필요 info plist : Privacy - Camera Usage Description
        // -----------------------------------------
        2. 필요 import : import AVFoundation , import Photos
        // -----------------------------------------
        3. 호출 방법 : if C_Permission().getCameraAuthCheck() == true {} else {}
        // -----------------------------------------
        4. 참고 퍼미션 요청 알림 : 게시물 업로드를 위해 카메라 접근 권한이 필요합니다. 허용하시겠습니까?
        // -----------------------------------------
        5. 주요 참고 : 뷰 컨트롤러 viewDidAppear 뷰 화면 표시 , 포그라운드 상태에서 요청 수행 실시
        // -----------------------------------------
        */
        
        // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
        let semaphore = DispatchSemaphore(value: 0)
        
        // [카메라 접근 권한 확인 실시]
        AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
            if granted {
                print("")
                print("====================================")
                print("[C_Permission >> getCameraAuthCheck() :: 카메라 접근 권한 확인 실시]")
                print("상태 :: 카메라 권한 허용")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkCameraFlag = true
                
                // [세마포어 신호 알림]
                semaphore.signal()
            } else {
                print("")
                print("====================================")
                print("[C_Permission >> getCameraAuthCheck() :: 카메라 접근 권한 확인 실시]")
                print("상태 :: 카메라 권한 거부")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkCameraFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
            }
        })
        
        // [세마포어 확인 대기]
        semaphore.wait()
        
        print("")
        print("====================================")
        print("[C_Permission >> getCameraAuthCheck() :: 카메라 접근 권한 확인 실시]")
        print("return :: \(self.checkCameraFlag)")
        print("====================================")
        print("")
        
        // [결과 리턴 실시]
        return self.checkCameraFlag
    }
    
    
    
    
    
    // MARK: - [음성 마이크 퍼미션 권한 확인 실시]
    var checkMicroFlag = false
    func getMicroAuthCheck() -> Bool {
        print("")
        print("====================================")
        print("[C_Permission >> getMicroAuthCheck() :: 마이크 접근 권한 요청 실시]")
        print("====================================")
        print("")
        
        /*
        // -----------------------------------------
        // [getMicroAuthCheck 메소드 설명]
        // -----------------------------------------
        1. 필요 info plist : Privacy - Microphone Usage Description , Privacy - Access to a File Provide Domain Usage Description
        // -----------------------------------------
        2. 필요 import : import AVFoundation , import Photos
        // -----------------------------------------
        3. 호출 방법 : if C_Permission().getMicroAuthCheck() == true {} else {}
        // -----------------------------------------
        4. 참고 퍼미션 요청 알림 :
          - 게시물 업로드를 위해 음성 접근 권한이 필요합니다. 허용하시겠습니까?
          - 게시물 업로드를 위해 파일 접근 권한이 필요합니다. 허용하시겠습니까?
        // -----------------------------------------
        5. 주요 참고 : 뷰 컨트롤러 viewDidAppear 뷰 화면 표시 , 포그라운드 상태에서 요청 수행 실시
        // -----------------------------------------
        */
        
        // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
        let semaphore = DispatchSemaphore(value: 0)
        
        // [음성 접근 권한 확인 실시]
        AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in
            if granted {
                print("")
                print("====================================")
                print("[C_Permission >> getMicroAuthCheck() :: 마이크 접근 권한 확인 실시]")
                print("상태 :: 마이크 권한 허용")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkMicroFlag = true
                
                // [세마포어 신호 알림]
                semaphore.signal()
            } else {
                print("")
                print("====================================")
                print("[C_Permission >> getMicroAuthCheck() :: 마이크 접근 권한 확인 실시]")
                print("상태 :: 마이크 권한 거부")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkMicroFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
            }
        })
        
        // [세마포어 확인 대기]
        semaphore.wait()
        
        print("")
        print("====================================")
        print("[C_Permission >> getMicroAuthCheck() :: 마이크 접근 권한 확인 실시]")
        print("return :: \(self.checkMicroFlag)")
        print("====================================")
        print("")
        
        // [결과 리턴 실시]
        return self.checkMicroFlag
    }
    
    
    
    
    
    // MARK: - [푸시 알림 퍼미션 권한 확인 실시]
    var checkPushFlag = false
    func getPushAuthCheck() -> Bool {
        print("")
        print("====================================")
        print("[C_Permission >> getPushAuthCheck() :: 푸시 알림 권한 요청 실시]")
        print("====================================")
        print("")
        
        /*
        // -----------------------------------------
        // [getPushAuthCheck 메소드 설명]
        // -----------------------------------------
        1. 푸시 알림에 필요한 퍼미션 권한 관리
        // -----------------------------------------
        2. 호출 방법 : if C_Permission().getPushAuthCheck() == true {} else {}
        // -----------------------------------------
        3. 주요 참고 : 뷰 컨트롤러 viewDidAppear 뷰 화면 표시 , 포그라운드 상태에서 요청 수행 실시
        // -----------------------------------------
        */
        
        // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
        let semaphore = DispatchSemaphore(value: 0)
        
        // [푸시 알림 권한 확인 실시]
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] // [푸시 알림 권한]
        UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (success, error) in // [푸시 알림 권한 요청]
            // [success 부분에 권한을 허락하면 true / 권한을 허락하지 않으면 false 값이 들어갑니다]
            if let error = error {
                print("")
                print("====================================")
                print("[C_Permission >> getPushAuthCheck() :: 푸시 알림 권한 확인 실시]")
                print("error :: \(error.localizedDescription)")
                print("====================================")
                print("")
                
                // [리턴 결과 플래그 값 변경]
                self.checkPushFlag = false
                
                // [세마포어 신호 알림]
                semaphore.signal()
            }
            else {
                if success {
                    print("")
                    print("====================================")
                    print("[C_Permission >> getPushAuthCheck() :: 푸시 알림 권한 확인 실시]")
                    print("상태 :: 푸시 알림 권한 허용")
                    print("====================================")
                    print("")
                    
                    // [리턴 결과 플래그 값 변경]
                    self.checkPushFlag = true
                    
                    // [세마포어 신호 알림]
                    semaphore.signal()
                }
                else {
                    print("")
                    print("====================================")
                    print("[C_Permission >> getPushAuthCheck() :: 푸시 알림 권한 확인 실시]")
                    print("상태 :: 푸시 알림 권한 거부")
                    print("====================================")
                    print("")
                    
                    // [리턴 결과 플래그 값 변경]
                    self.checkPushFlag = false
                    
                    // [세마포어 신호 알림]
                    semaphore.signal()
                }
            }
        }
        
        // [세마포어 확인 대기]
        semaphore.wait()
        
        print("")
        print("====================================")
        print("[C_Permission >> getPushAuthCheck() :: 푸시 알림 권한 확인 실시]")
        print("return :: \(self.checkPushFlag)")
        print("====================================")
        print("")
        
        // [결과 리턴 실시]
        return self.checkPushFlag
    }
    
    
} // [클래스 종료]

 

반응형
Comments