관리 메뉴

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

[iOS - swift] 4. Observable로 Wrapping하여 권한 요청) RxSwift의 concat을 이용하여 순서대로 권한 요청 방법 본문

iOS 응용 (swift)

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

jake-kim 2022. 1. 7. 00:33

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

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

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

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

아이디어

  • 권한 설정코드들을 Observable로 wrapping
  • RxSwift의 concat연산자를 활용하여 Observable들을 순서대로 방출
  • Observable로 Wrapping하는 방법이 나와있는 위 Observable로 Wrapping, 1 ~ 3번 글 확인

세팅

  • 프레임워크
    pod 'RxSwift'
    pod 'RxCocoa'
    pod 'RxCoreLocation'​
  • info.plist

	<key>NSUserTrackingUsageDescription</key>
	<string>개인에게 최적화된 광고를 제공하기 위해 사용자의 광고 활동 정보를 수집합니다.</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>~ 마이크 권한이 필요합니다.</string>
	<key>NSCameraUsageDescription</key>
	<string>~ 카메라 권한이 필요합니다.</string>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>~ 사진 권한이 필요합니다.</string>
	<key>NSLocationWhenInUseUsageDescription</key>
	<string>~ 위치 권한이 필요합니다.</string>
	<key>UIApplicationSceneManifest</key>

Permission 요청 코드 추가

ex) PhotoPermssionManager 코드

import RxSwift
import RxCocoa
import Photos

class PhotoPermissionManager {
  static let shared = PhotoPermissionManager()
  private init() {}
  
  func requestPhoto() -> Observable<PHAuthorizationStatus> {
    Observable<PHAuthorizationStatus>.create { observable in
      PHPhotoLibrary.requestAuthorization {
        observable.onNext($0)
        observable.onCompleted()
      }
      return Disposables.create()
    }
  }
}
  • 사용할 때 RxSwift의 Concat을 사용하여 연속적으로 권한을 요청하도록 구현
// ViewController.swift

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
  private let disposeBag = DisposeBag()
  
  @IBAction func didTapButton(_ sender: Any) {
    Observable.concat(
      LocationPermissionManager.shared.requestLocation().map { _ in Void() },
      PhotoPermissionManager.shared.requestPhoto().map { _ in Void() },
      CameraPermissionManager.shared.requestCamera().map { _ in Void() },
      MicPermissionManager.shared.requestMic().map { _ in Void() },
      ATTPermissionManager.shared.requestATT().map { _ in Void() }
    )
      .bind(onNext: { print("finish") })
      .disposed(by: self.disposeBag)
  }
}

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

Comments