[ScreenTimeAPI ] 1. FamilyControls 설정 (a.k.a UIKit)

Lena·2024년 1월 24일

iOS

목록 보기
1/4
post-thumbnail

학교 GDSC 학회에서 진행하는 Student Challenge 프로젝트를 시작했다. 서버팀 2명, iOS 2명 (1.5명?), AI/ML 1명으로 총 4명이서 진행하고 있다.

기획 및 디자인 단계는 마무리가 되었고, 우리가 구현해야 하는 것은 iOS 기기의 스크린타임 정보를 받아와 친구와 공유하고 이를 통계로 보여주는 것이 주된 부분이다.

WWDC21, 22에서 ScreenTime API를 공개하여 해당 API를 사용하려고 하니 참고할 샘플 프로젝트가 거의 없어 (특히 UIKit 프로젝트에 적용한 ...) 매우 난항을 겪고 있었다.

ScreenTime API를 구성하는 3가지의 프레임워크FamilyControls, ManagedSettings, DeviceActivity를 하나씩 프로젝트에 적용하는 과정을 정리했다.

FamilyControls


FamilyControls를 통해 부모-자녀 간 혹은 개별 사용자가 사용할 수 있도록 ScreenTime API 권한 설정을 관리하는 프레임워크이다.
기존에는 icloud를 통해서만 가능했지만, WWDC22 이후 개별 사용자의 승인도 가능해졌다.

1. Capability 추가

프로젝트의 Signing & Capabilities에서 + Capability 를 눌러 FamilyControls 를 추가해준다.

2. 권한 설정 메서드 작성

나는 FamilyControlsManager 클래스를 별도로 생성해 권한 설정 메서드를 구현하였다.

import Foundation
import FamilyControls

struct FamilyControlsManager {
    
    let center =  AuthorizationCenter.shared
    
    func requestAuthorization() {
        Task {
            do {
                try await center.requestAuthorization(for: FamilyControlsMember.individual)
                print("스크린타임 권한 설정 성공")

            } catch {
                print("스크린타임 권한 설정이 실패했습니다. \n \(error.localizedDescription)")
            }
        }
    }
}

3. 권한 설정 호출

AppDelegate.swift에 FamilyControls를 import 하고, didFinishLaunchingWithOptions에 추가해준다.

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        FamilyControlsManager().requestAuthorization()
        
        return true
    }

Wetox의 경우 앱을 실행하자마자 스크린타임 권한을 기본적으로 필요하기 때문에 AppDelegate설정해주었다.

앱을 실행했을 때 권한이 없다면, 이렇게 권한 허용을 요청하게 된다.

여기까지는 순조로웠다.
DeviceActivityMonitorExtension을 마주하기 전까지는...

profile
어제보다 성장하는 iOS 개발자입니다.

0개의 댓글