| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- UITableViewCell 동적높이
- uikit
- Decodable
- ios 26
- Pod
- AVFoundation
- 2018 KAKAO BLIND RECRUITMENT
- avcapturesession
- cocoapods
- Realm
- 프로그래머스
- 정보처리기사 실기
- ios외부카메라연결
- 정보처리기사
- programmers
- CustomCode
- Xcode
- IOS
- 정보처리기사 실기 요약본
- Codable
- 위클리챌린지
- swift
- ios외부디바이스연결
- JSONParser
- UITableViewCell dynamic height
- usb카메라연결
- parse
- JSON
- ios카메라유선연결
- UITableView
- Today
- Total
iOS 개발일기
[Swift] 앱 비활성화 시 앱 화면 가리기 본문
우리가 보통 하단 홈바를 스와이프하거나 홈 버튼을 두번 클릭하면 나오는 앱 목록 화면을 앱 스위처라고 부르는데
간혹 앱 스위처로 이동할 경우 현재 사용되고 있던 앱이 표시되던 화면을 가리는 것을 볼 수 있다.


대부분 개인 정보 보호를 목적으로 화면 보호기를 설정하는데
카카오톡이나 토스 외에도 금융 및 개인정보를 다루는 앱에서 흔히 사용되고 있다.
화면 보호기
그럼 위와 같이 화면 보호기를 설정하기 위해서는 앱의 생명주기를 알면 쉽게 구현이 가능하다.
앱이 활성/비활성 상태일 경우에 화면을 가리기 위한 UI만 표시해주면 된다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
...
}
//앱이 비활성화될 때, 화면 보호기 표시
func sceneWillResignActive(_ scene: UIScene) {
guard let window else {return}
let privacyView = UIView(frame: window.bounds)
privacyView.tag = 999
privacyView.backgroundColor = .systemRed
window.addSubview(privacyView)
}
//앱이 활성화될 떄, 화면 보호기 제거
func sceneDidBecomeActive(_ scene: UIScene) {
guard let privacyView = window?.viewWithTag(999) else {return}
privacyView.isHidden = true
privacyView.removeFromSuperview()
}
}
이 코드를 실행하면 아래와 같은 결과가 나온다.


앱을 앱 스위처로 이동하거나 좌측 상단의 알림센터 혹은 우측 상단의 제어센터를 열어도 화면 보호기가 표시된다.
willResignActive
해당 메서드는 앱이 비활성화 상태가 될 때 호출되는 메서드이기 때문에 꼭 앱 스위처로 갔을 경우에만 실행되는 것은 아니다.
앱이 비활성화가 되는 상태는 앱은 실행되고 있지만 앱이 사용자 이벤트를 받지 못하는 상태이며, 주로 앱 스위처로 전환되거나 기기의 상단에 위치하고 있는 알림/제어 센터를 열거나 등의 다양한 이유로 비활성화 상태가 될 수 있다.
시스템 알림이 표시되는 경우에도 앱은 비활성화 상태로 진입
화면 보호기를 테스트하다 알게된 것은 시스템 알림이 표시되는 경우에도 앱은 비활성화 상태로 진입하게되어 화면 보호기를 표시하게 된다는 사실이다.
대표적인 예로, UIAlertController를 이용한 알림이 표시되었을 경우 화면 보호기가 표시되지 않지만
카메라 권한 알림(시스템 알림)이 표시되었을 경우 화면 보호기가 표시되는 것을 확인 할 수 있다.

앱 내에서 사용자 권한 요청을 하는 경우에 표시되는 알림창이 시스템 알림창으로 표시되는데 이 알림에 의해서 의도치 않게 화면 보호기가 활성화되는 경우가 존재할 수 있다. (그 외 FaceID, 화면 스크린샷 수정 등)
모든 화면에서 화면 보호기를 표시하지 않으려면 필요한 뷰 컨트롤러에서 알림(Notification)을 등록해서 사용하는 방법이 가장 깔끔한 것 같다.
override func viewDidLoad() {
super.viewDidLoad()
setupNotifications()
}
@objc
private func showPrivacyView() {
let privacyView = UIView(frame: view.bounds)
privacyView.tag = 999
privacyView.backgroundColor = .systemGreen
view.addSubview(privacyView)
}
@objc
private func hidePrivacyView() {
guard let privacyView = view.viewWithTag(999) else {return}
privacyView.isHidden = true
privacyView.removeFromSuperview()
}
private func setupNotifications() {
//앱이 비활성화될 때, 화면 보호기 표시
NotificationCenter.default.addObserver(
self,
selector: #selector(showPrivacyView),
name: UIApplication.willResignActiveNotification,
object: nil
)
//앱이 활성화될 때, 화면 보호기 제거
NotificationCenter.default.addObserver(
self,
selector: #selector(hidePrivacyView),
name: UIApplication.didBecomeActiveNotification,
object: nil
)
}
'iOS > Swift' 카테고리의 다른 글
| [Swift] UIKit 환경에서 Property Wrapper 사용하기 (0) | 2025.03.17 |
|---|---|
| [Swift] UITableView Cell 높이 동적 할당 방법 (0) | 2024.12.26 |
| [Swift] UICollectionView 'didSelectItemAt' 함수가 호출되지 않는 이유 (2) | 2023.12.07 |
| [Swift] JSONParser - JSONSerialization (0) | 2022.03.16 |
| [Swift] JSONParser - Decodable(2) (0) | 2022.03.15 |