Skip to content

Permission / Privacy

권한 요청은 앱이 먼저 요구하는 절차가 아니라, 사용자가 그 기능을 쓰려는 순간 이해하고 선택할 수 있게 돕는 UX입니다.

가장 짧은 결론앱 실행 직후 권한을 먼저 요구하지 말고, 기능 맥락 → 시스템 요청 → 거절 후 복구 안내 순서로 설계합니다.

먼저 실제 앱 화면으로 보기

카메라 권한을 요청하기 전에 기능 맥락과 이유를 설명하는 ivibe 앱 화면
Before request 시스템 alert 전에 왜 필요한지 먼저 설명합니다.
ivibe 앱 위에 표시된 실제 iOS 카메라 권한 요청 alert
System prompt iOS 권한 alert는 앱이 꾸미는 화면이 아니라 시스템 결정 지점입니다.
권한 거절 후 설정에서 카메라 접근을 다시 켜도록 안내하는 ivibe 앱 화면
Recovery 거절 후에는 같은 요청을 반복하지 말고 설정 복구 경로를 안내합니다.

한눈에 보기

1Pre-prompt

권한이 왜 필요한지 앱 화면에서 먼저 설명합니다.

2System prompt

사용자가 기능을 시작한 직후 iOS 권한 요청을 띄웁니다.

3Recovery

거절 이후에는 설정에서 다시 켜는 방법을 알려줍니다.

가장 짧은 판단법

권한 요청 화면을 만들 때는 이 세 질문만 먼저 봅니다.

  1. 지금 요청해야 하는가?
    사용자가 아직 기능을 쓰지 않았는데 앱 실행 직후 요청한다면 대부분 너무 이릅니다.
  2. 왜 필요한지 사용자 언어로 설명했는가?
    “카메라 권한 필요”보다 “사진 리뷰 기능에서 문제 화면을 촬영하기 위해 필요”가 낫습니다.
  3. 거절해도 길을 막지 않았는가?
    권한을 거절하면 기능 제한과 설정 복구 경로를 알려줘야 합니다.

권한별로 달라지는 설계 포인트

권한요청 타이밍Pre-prompt가 필요한 경우거절 후 복구 안내
Camera촬영 버튼을 누른 직후촬영 결과가 앱의 핵심 입력일 때촬영 없이 가능한 대체 업로드, 설정에서 카메라 켜기
Photos사진 선택/저장 행동 직후여러 장 접근, 저장 권한처럼 범위가 헷갈릴 때제한된 접근 범위 설명, 사진 선택기를 다시 여는 길
Location지도/주변/체크인 기능을 시작할 때항상 허용·정확한 위치처럼 민감도가 높을 때대략 위치/수동 입력 대안, 설정 복구 경로
Notifications알림을 받을 가치가 생긴 순간알림 빈도·종류를 사용자가 선택해야 할 때앱 안 알림 설정, 시스템 설정 이동 안내

권한마다 시스템 alert 문구와 회복 경로가 다릅니다. 그래서 “권한 허용이 필요합니다” 한 문장으로 통일하기보다, 사용자가 하려던 행동을 계속할 방법을 권한별로 보여주는 것이 좋습니다.

컴포넌트로 이해하기

Pre-prompt

무엇인가

시스템 권한 alert를 띄우기 전에 앱 안에서 이유와 맥락을 설명하는 화면입니다.

언제 쓰나

  • 권한이 기능의 핵심일 때
  • 권한 요청 문구만으로 이유가 충분히 전달되지 않을 때
  • 권한을 거절하면 기능이 제한되는 경우

주의점

Pre-prompt를 시스템 alert처럼 꾸미면 안 됩니다. 사용자가 시스템 요청과 앱 설명을 헷갈릴 수 있습니다.

System permission prompt

무엇인가

iOS가 표시하는 실제 권한 결정 alert입니다. 앱은 이 alert의 디자인을 바꾸지 못하고, 사용자는 여기서 허용/거절을 선택합니다.

언제 띄우나

  • 사용자가 해당 기능을 직접 시작했을 때
  • 앱이 실제로 카메라, 위치, 사진, 마이크 같은 보호 리소스에 접근해야 할 때
  • Info.plist의 usage description이 사용자가 이해할 수 있을 만큼 구체적일 때

Recovery state

무엇인가

권한을 거절한 뒤 앱이 보여주는 복구 안내입니다.

언제 쓰나

  • 사용자가 권한을 거절했거나 설정에서 꺼둔 경우
  • 권한 없이는 기능이 제한되는 경우
  • 앱이 반복해서 같은 권한 요청을 띄울 수 없는 경우

Bad / Good 빠른 비교

Bad

앱 실행 직후 권한 몰아치기

  • 사용자는 아직 왜 필요한지 모릅니다.
  • 거절하면 기능 흐름이 끊깁니다.
  • 권한 요청이 앱의 첫인상이 됩니다.

Good

기능 맥락 안에서 요청하기

  • 사용자가 기능을 시작할 때 이유를 설명합니다.
  • 시스템 alert의 목적 문구를 구체적으로 씁니다.
  • 거절 후에도 설정 복구 경로를 제공합니다.

SwiftUI / iOS SDK 힌트

swift
import AVFoundation
import SwiftUI

struct CameraPermissionButton: View {
    @State private var status = AVCaptureDevice.authorizationStatus(for: .video)

    var body: some View {
        Button("사진 리뷰 시작") {
            AVCaptureDevice.requestAccess(for: .video) { granted in
                Task { @MainActor in
                    status = AVCaptureDevice.authorizationStatus(for: .video)
                }
            }
        }
    }
}

권한 요청을 구현할 때는 코드보다 Info.plist 문구가 더 중요할 때가 많습니다.

text
NSCameraUsageDescription = 사진 리뷰 기능에서 iOS UX 문제를 촬영해 확인하기 위해 카메라 접근이 필요합니다.

거절 후 복구 화면에서는 UIApplication.openSettingsURLString으로 앱 설정 화면을 열 수 있습니다. 다만 문서와 UI에서는 “설정에서 켜세요”만 반복하지 말고, 현재 어떤 기능이 제한되는지를 함께 설명해야 합니다.

공식 근거

확인할 것

  • [ ] 앱 실행 직후 권한을 먼저 요청하지 않는다.
  • [ ] 권한이 필요한 기능을 사용자가 시작한 뒤 요청한다.
  • [ ] 시스템 alert 전에 앱 화면에서 이유와 이점을 설명한다.
  • [ ] Info.plist usage description이 구체적이다.
  • [ ] 거절 후 같은 요청을 반복하지 않는다.
  • [ ] 권한이 꺼졌을 때 제한되는 기능과 설정 복구 경로를 안내한다.
  • [ ] 권한 없이도 가능한 대체 흐름이 있다면 제공한다.

다음 글

다음은 Loading / Empty / Error State입니다. AI로 만든 앱에서 자주 빠지는 “기다리는 중”, “아무것도 없음”, “실패 후 회복” 상태를 실제 iOS 앱 화면으로 만들고 비교합니다.