// Make sure that your class name matches the NSExtensionPrincipalClass in your Info.plist. class ShieldActionExtension: ShieldActionDelegate { override func handle(action: ShieldAction, for application: ApplicationToken, completionHandler: @escaping (ShieldActionResponse) -> Void) { // Handle the action as needed. switch action { case .primaryButtonPressed: completionHandler(.defer) case .secondaryButtonPressed: Timer(timeInterval: 5, repeats: false) { timer in Restrictions.shared.unlockedAllApps() } completionHandler(.defer) @unknown default: fatalError() } } override func handle(action: ShieldAction, for webDomain: WebDomainToken, completionHandler: @escaping (ShieldActionResponse) -> Void) { // Handle the action as needed. print("func handle(action: ShieldAction, for webDomain: WebDomainToken,") completionHandler(.close) } override func handle(action: ShieldAction, for category: ActivityCategoryToken, completionHandler: @escaping (ShieldActionResponse) -> Void) { // Handle the action as needed. NSLog("handle(action: ShieldAction, for category: ActivityCategoryToken") completionHandler(.defer) } }
ShieldActionExtensions will exit shortly after the completionHandler
is called, so the Timer's closure will likely not be run before your extension's lifecycle ends. A better option would be to use a DeviceActivityMonitor extension. When the secondary button gets pressed, your ShieldActionExtension can create a DeviceActivitySchedule
that starts 5 seconds from Date.now
and start monitoring that schedule using a DeviceActivityCenter
. Your DeviceActivityMonitor extension can then call Restrictions.shared.unlockAllApps()
when it receives the intervalDidStart
callback for that schedule.