[iOS 26.x] WKWebView crashes with NSInternalInconsistencyException — KVO inconsistency on configuration.enforcesChildRestrictions from STScreenTimeConfigurationObserver

Summary

We are seeing a recurring fatal NSInternalInconsistencyException on iOS 26.x devices. The crash originates entirely from system frameworks (Foundation / WebKit / Screen Time / NSXPCConnection) — there are no app frames in the stack. The exception is raised from an XPC reply on a worker thread, so the host app cannot wrap it in @try/@catch.

The crash appears to be a KVO consistency check failing inside the platform's internal Screen Time observer (STScreenTimeConfigurationObserver) when it observes WKWebView's configuration.enforcesChildRestrictions key path. The exception message states the value of the intermediate key configuration changed without an appropriate KVO notification.

Environment

  • iOS versions: 26.2.1 (also seen on 26.0.x – 26.2.x)
  • Devices: iPhone 13 (iPhone14,5), iPhone 16 Plus, others
  • App orientation: portrait
  • Process state at crash: BACKGROUND (most occurrences)
  • App uses WKWebView in several screens (link preview, in-app web, 3rd-party SDK web views)
  • Crash is recurring across multiple users on iOS 26.x and is reproducible at scale in production

Exception

Name: NSInternalInconsistencyException Reason: Cannot update for observer <WKScreenTimeConfigurationObserver 0x...> for the key path "configuration.enforcesChildRestrictions" from <STScreenTimeConfigurationObserver 0x...>, most likely because the value for the key "configuration" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the STScreenTimeConfigurationObserver class.

Crashing thread (top frames)

0 CoreFoundation __exceptionPreprocess 1 libobjc.A.dylib objc_exception_throw 2 Foundation -[NSKeyValueNestedProperty object:withObservance:didChangeValueForKeyOrKeys:recurse:forwardingValues:] 3 Foundation NSKeyValueDidChange 4 Foundation -[NSObject(NSKeyValueObservingPrivate) _changeValueForKeys:count:maybeOldValuesDict:maybeNewValuesDict:usingBlock:] 5 Foundation -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey🔑 key:usingBlock:] 6 Foundation NSSetObjectValueAndNotify 7 CoreFoundation invoking 8 Foundation -[NSInvocation invoke] 9 Foundation <deduplicated> 10 Foundation -[NSXPCConnection _decodeAndInvokeReplyBlockWithEvent:sequence:replyInfo:] 11 Foundation __88-[NSXPCConnection _sendInvocation:orArguments:count:methodSignature:selector:withProxy:]_block_invoke_5 12 libxpc.dylib _xpc_connection_reply_callout 13 libxpc.dylib _xpc_connection_call_reply_async 14 libdispatch.dylib _dispatch_mach_msg_async_reply_invoke 15 libdispatch.dylib _dispatch_root_queue_drain_deferred_item 16 libdispatch.dylib _dispatch_kevent_worker_thread

(Every frame above frame 0 lives in the system. No app frames are present.)

What we observed

  1. Crash fires asynchronously on a libdispatch kevent worker thread, triggered by an XPC reply from the Screen Time service.
  2. The exception is thrown while the platform updates a chained KVO key path (configuration.enforcesChildRestrictions) on a WKWebView instance.
  3. The intermediate key configuration apparently changed without a paired willChange/didChange notification, which Foundation's KVO machinery then flags as inconsistency.
  4. Because the throw happens on the XPC reply path, there is no app-level synchronous frame we can wrap to recover. The exception unwinds straight into std::__terminate.

What we tried (no effect)

  • Confirmed all WKWebView creation and release happens on the main thread.
  • Stop loading and nil out navigationDelegate before releasing the WKWebView.
  • Avoided mutating WKWebViewConfiguration after the WKWebView is created.
  • Checked for any custom KVO on WKWebView.configuration in app code — none exists.
  • The crash still reproduces; we have no path to mitigate it from the application side.

Questions for Apple / the community

  1. Is STScreenTimeConfigurationObserver expected to observe WKWebView.configuration.enforcesChildRestrictions under all conditions on iOS 26, or only when Screen Time /

Communication Limits / Child Restrictions are enabled on the device? 2. Is there a public API (WKWebViewConfiguration option, Info.plist key, etc.) to opt a WKWebView out of Screen Time observation for hosts that do not need Screen Time integration for their web content? 3. Is this a known regression in iOS 26.x KVO chained-key-path notification posting inside WebKit's Screen Time integration? If so, is a fix slated for an upcoming 26.x release? 4. Is there any recommended workaround on the application side that does not rely on swizzling private Foundation / NSXPCConnection methods?

Reproduction notes

We do not have a deterministic local repro. Crashes are heavily concentrated on:

  • iOS 26.2.1
  • Devices with Screen Time / Communication Limits / Child Restrictions configured at the OS level
  • App entering the BACKGROUND state shortly after a WKWebView session

If anyone has a reliable local repro on a developer device, please share — we would also like to file a Feedback Assistant report with steps.

Filed Feedback

Will attach FB number once filed.

Thanks in advance.

[iOS 26.x] WKWebView crashes with NSInternalInconsistencyException — KVO inconsistency on configuration.enforcesChildRestrictions from STScreenTimeConfigurationObserver
 
 
Q