I’m building an iOS app that uses FamilyControls + ManagedSettings + DeviceActivity.
Goal: temporarily “unlock” a shielded app for N minutes, then automatically re-apply the shield when the timer expires.
What I do: In the main app, when user picks an expiry (e.g. 15 min, 30 min). I start a non-repeating DeviceActivity schedule and remove the app’s ApplicationToken from ManagedSettingsStore().shield.applications. I also store activeUnlockBundleID etc. in an App Group so the DeviceActivityMonitor extension can re-lock at the end.
Expected: DeviceActivityMonitor.intervalDidEnd(for:) is invoked when the non-repeating interval ends, and I re-add the token to the shield set.
Actual: The app does not re-lock when the interval expires. I added OS logs as well as “debug local notifications” from the DeviceActivityMonitor extension in: init() intervalDidStart intervalDidEnd eventDidReachThreshold None of these logs or notifications ever appear, which suggests the extension is never invoked (or cannot schedule local notifications or OS logs).
Environment:
- Device: iPhone 17 Pro
- iOS 26.3.1
- Xcode 26.4
- Running on a physical device
- Notification permissions for the app: granted
- App + extensions are in the same App Group entitlement.
- Extension Info.plist has:
NSExtensionPointIdentifier = com.apple.deviceactivity.monitor NSExtensionPrincipalClass = $(PRODUCT_MODULE_NAME).DeviceActivityMonitorExtension
Questions:
- Are there known limitations/requirements for DeviceActivityMonitor callbacks where intervalDidEnd doesn't to fire?
- Is posting local notifications / OS Logs from a DeviceActivityMonitor extension supported/reliable? If not, what’s the recommended way to verify the extension is invoked?
- If this looks like a platform bug, should I file Feedback Assistant? If so, what logs/artifacts are most useful?