관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 3. Observable로 Wrapping하여 권한 요청) 마이크 권한, ATT(App Tracking Transparency) 권한 본문

iOS 응용 (swift)

[iOS - swift] 3. Observable로 Wrapping하여 권한 요청) 마이크 권한, ATT(App Tracking Transparency) 권한

jake-kim 2022. 1. 6. 00:25

1. Observable로 Wrapping하여 권한 요청) 위치 권한, 실시간 위치 정보 획득

2. Observable로 Wrapping하여 권한 요청) 사진 권한, 카메라 권한

3. Observable로 Wrapping하여 권한 요청) 마이크 권한, ATT(App Tracking Transparency) 권한

4. Observable로 Wrapping하여 권한 요청) RxSwift의 concat을 이용하여 순서대로 권한 요청 방법

Observable로 wrapping 작업 핵심

  • 기존에 Observable 형태를 리턴해주는 작업이면, RxSwift의 생성자 연산자 중에 deferred 연산자 사용하여 wrapping
  • 기존에 Observable 형태가 아니고 클로저 형태로 값을 받는 경우, create 연산자 사용

사용 프레임워크

pod 'RxSwift'
pod 'RxCocoa'

마이크 권한 설정

  • info.plist에서 설정: Privacy - Microphone Usage Description

  • create 연산자를 이용하여 Observable로 wrapping
import RxSwift
import AVFoundation

class MicPermissionManager {
  static let shared = MicPermissionManager()
  private init() {}
  
  func requestMic() -> Observable<Bool> {
    Observable<Bool>.create { observable in
      AVAudioSession.sharedInstance().requestRecordPermission { isGranted in
        observable.onNext(isGranted)
        observable.onCompleted()
      }
      return Disposables.create()
    }
  }
}
  • 사용하는 쪽
@IBAction func didTapMicPermissionButton(_ sender: Any) {
  MicPermissionManager.shared.requestMic()
    .bind { print($0) }
    .disposed(by: self.disposeBag)
}

ATT 접근 권한

  • create 연산자를 이용하여 Observable로 Wrapping
    • 주의: import AppTrackingTransparency 
import RxSwift
import AppTrackingTransparency

class ATTPermissionManager {
  static let shared = ATTPermissionManager()
  private init() {}
  
  func requestATT() -> Observable<ATTrackingManager.AuthorizationStatus> {
    Observable<ATTrackingManager.AuthorizationStatus>.create { observable in
      ATTrackingManager.requestTrackingAuthorization { status in
        observable.onNext(status)
        observable.onCompleted()
      }
      return Disposables.create()
    }
  }
}
  • 사용하는 쪽
@IBAction func didTapATTPermissionButton(_ sender: Any) {
  ATTPermissionManager.shared.requestATT()
    .bind { print($0) }
    .disposed(by: self.disposeBag)
}

* 전체 코드: https://github.com/JK0369/ExMicAttPermission

 

* 참고

https://developer.apple.com/documentation/avfaudio/avaudiosession/1616601-requestrecordpermission

Comments