logo hsb.horse
← 블로그 목록으로 돌아가기

블로그

Screen Time API로 iOS 셀프 컨트롤 앱을 만들기 위한 설계 가이드

NEDNSProxyProvider의 함정부터 FamilyControls + ManagedSettings 설계, 두 개의 Shield Extension, App Group 기반 언락 handoff, Personal Team 제약까지. Screen Time API로 iOS 차단 앱을 만드는 전체 그림을 정리했다.

게시일:

iOS 개발이 처음인 상태에서 사이트 차단형 셀프 컨트롤 앱을 만들려고 하면, 조사할수록 “생각했던 것과 다르다”는 지점이 계속 나온다. DNS 수준 차단을 목표로 NEDNSProxyProvider에서 시작했고, Extension의 존재를 알게 되었고, 서명 제한에 막혔고, 결국 Screen Time API를 올바르게 쓰는 방법에 도달했다.

이 글은 그 과정에서 나온 다섯 개의 글을 묶은 인덱스다. iOS 경험이 많지 않은 상태에서 같은 문제를 겪는 사람에게 도움이 되면 좋겠다.


1. 시작부터 잘못된 입구로 들어가지 않기

iOS에서 사이트 차단을 구현하려고 찾다 보면 NEDNSProxyProvider가 눈에 들어온다. 이름도 맞고 용도도 맞아 보이지만, 이건 App Store 배포용 앱을 위한 클래스가 아니다. MDM으로 관리되는 supervised device용이다.

iOS에서 사이트 차단을 만들 때 NEDNSProxyProvider를 고르면 안 되는 이유

DNS 차단 아이디어를 버리고 Screen Time API로 넘어갈지 판단하기 전에 먼저 읽어 두면 좋다.


2. Screen Time API의 기본 설계

정답은 FamilyControls + ManagedSettings 조합이다. AuthorizationCenter로 권한을 받고, FamilyActivityPicker로 차단 대상을 선택하고, ManagedSettingsStore에 규칙을 기록한다.

FamilyControls + ManagedSettings로 iOS 자기 제한 차단을 설계하기

차단 대상을 자유 입력 URL로 관리하려고 하면 막힌다. FamilyActivitySelection 중심의 토큰 기반 설계가 전제라는 점도 여기서 설명한다.


3. Shield Extension은 두 개가 필요하다

ManagedSettings가 규칙을 적용했을 때 표시되는 shield 화면을 커스터마이즈하려면 Extension이 두 개 필요하다. Xcode에서 타깃 하나만 추가하면 된다고 생각하면 여기서 막힌다.

iOS Shield UI에는 확장 하나가 아니라 둘이 필요하다

Shield Action Extension(ShieldActionDelegate)과 Shield Configuration Extension(ShieldConfigurationDataSource) 각각의 Extension Point Identifier, principal class, Info.plist 설정을 정리했다.


4. shield에서 앱으로 언락 handoff하기

Apple은 shield 화면에서 메인 앱을 직접 실행해서 언락 플로우를 시작하는 경로를 제공하지 않는다. ShieldActionDelegate가 반환할 수 있는 값은 .close 또는 .defer뿐이다.

Shield Extension에서 메인 앱으로의 언락 handoff를 App Group으로 구현하기

이 글에서는 Extension이 App Group 안의 공유 UserDefaults에 “언락 요청”을 기록하고, 사용자가 앱을 열었을 때 앱이 이를 읽는 handoff 패턴을 설명한다. 이런 제약이 왜 있는지와, 그 안에서 UX를 어떻게 정리할지도 함께 다뤘다.


5. 실기기 테스트에는 유료 개발자 계정이 필요하다

Family Controls (Development) entitlement는 무료 Apple ID 기반의 Personal Team에서는 사용할 수 없다. 실기기 테스트를 하려면 Apple Developer Program 가입이 필요하다.

Personal Team으로는 Family Controls를 실기기에서 테스트할 수 없다

시뮬레이터에서 가능한 것과 불가능한 것, In-App Purchase 같은 다른 entitlement와의 관계, 언제 유료 계정으로 전환하는 게 맞는지를 정리했다.


개발 순서로 정리하면

iOS 경험 없이 이 앱을 만든다면, 위 다섯 글을 읽고 나서 구현 순서를 이렇게 잡는 편이 가장 안정적이다.

먼저 NEDNSProxyProvider 아이디어를 버린다. 다음으로 FamilyControls + ManagedSettings 기본 설계를 확정하고 AuthorizationCenterFamilyActivityPicker를 쓰는 UI 플로우를 만든다. 그다음 Shield Extension 두 개를 추가하고 Info.plist를 올바르게 설정한다. 이후 App Group 기반 언락 handoff를 구현한다. 마지막으로 Apple Developer Program에 가입해서 실기기에서 검증한다.

이 순서대로 가면 나중에 설계를 다시 짤 가능성을 가장 낮출 수 있다. iOS에 익숙하지 않을수록 초반 API 선택 실수가 뒤에 있는 모든 것에 영향을 주기 때문에, 처음에 방향을 확인해 두는 것이 가장 효율적이다.