본문으로 건너뛰기

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) 시 커스텀 실드뷰에서 바로 앱화면으로 전환된다.