ShieldActionExtension 사용하기
ShieldActionExtension을 활용해 ShieldView와 MainApp 간 인터랙션할 수 있다.
데이터 공유에는 AppGroups에 등록된 데이터를 활용할 수 있다.
DeviceActivityCenter에 등록된 이벤트를 가져와 변경할 수 있다.
import DeviceActivity
import FamilyControls // FamilyActivitySelection 사용을 위해 가져옴
import ManagedSettings // ManagedSettingsStore 사용을 위해 가져옴
import SwiftUI // AppStorage 사용을 위해 가져옴
class ShieldActionExtension: ShieldActionDelegate {
// 다른 Target과 공유하기 위한 AppGroups에 등록한 UserDefaults
@AppStorage("KEY_NAME", store: UserDefaults(suiteName: APP_GROUP_NAME))
var myFamilyActivitySelection = FamilyActivitySelection() // Picker값 가져옴
// ManagedSettingsStore에 등록한 이벤트 정보 가져옴
let managedSettingsStore = ManagedSettingsStore(named: .default)
// MARK: ApplicationToken으로 제한한 앱을 열었을 때 뜨는 ShieldApp의 동작
override func handle(action: ShieldAction, for application: ApplicationToken, completionHandler: @escaping (ShieldActionResponse) -> Void) {
// Handle the action as needed.
switch action {
case .primaryButtonPressed:
// 변경할 로직 작성 가능
completionHandler(.close) // 쉴드뷰가 열려있는 앱 종료
case .secondaryButtonPressed:
completionHandler(.defer) // 쉴드뷰 화면 갱신
@unknown default:
fatalError()
}
}
// MARK: WebDomainToken으로 제한한 앱을 열었을 때 뜨는 ShieldApp의 동작
override func handle(action: ShieldAction, for webDomain: WebDomainToken, completionHandler: @escaping (ShieldActionResponse) -> Void) {
// Handle the action as needed.
completionHandler(.close)
}
// MARK: ActivityCategoryToken으로 제한한 앱을 열었을 때 뜨는 ShieldApp의 동작
override func handle(action: ShieldAction, for category: ActivityCategoryToken, completionHandler: @escaping (ShieldActionResponse) -> Void) {
// Handle the action as needed.
completionHandler(.close)
switch action {
case .primaryButtonPressed:
// SAMPLE - 5초 뒤에 앱 종료
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
completionHandler(.close)
}
case .secondaryButtonPressed:
completionHandler(.none) // 화면 갱신안함
@unknown default:
fatalError()
}
}
}
// DeviceActivityEvent에 등록된 이벤트명 확장
extension DeviceActivityEvent.Name {
static let `default` = Self("threshold.default")
}
NOTICE
- Shield 해제 시
completionHandler(.defer)시 커스텀 실드뷰가 깨지면서 앱화면으로 전환된다. - Shield 해제 시
completionHandler(.none)시 커스텀 실드뷰에서 바로 앱화면으로 전환된다.