WKWebView crashes in SSO App Extension on iOS 26 during loadRequest

We have a SAML-based SSO App Extension that uses WKWebView to load the SAML login request. This implementation has been working correctly on iOS versions prior to 26. However, starting with iOS 26, the extension consistently crashes when calling WKWebView.load(_:). The crash occurs inside WebKit, specifically in: /Library/Caches/com.apple.xbs/Sources/WebKit/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp at WebKit::WebPageProxy::loadRequest(...) No app-level exception is thrown, and the extension terminates with: Thread 10: EXC_BREAKPOINT (code=1, subcode=0x1a31dbe00) It appears that WKWebView initialization or WebsiteDataStore creation is now restricted in extension contexts on iOS 26, but this change is not documented in the SDK release notes. Could you please confirm if this is an intentional sandbox restriction in iOS 26 or a regression in WebKit? Steps to reproduce: Implement an App Extension using ASAuthorizationProviderExtensionAuthorizationRequest. Create a WKWebView instance in the extension. Attempt to load a SAML login request (POST request with headers). Observe immediate crash on iOS 26 (works fine on earlier versions). Expected behavior: WKWebView should load the request or fail gracefully as in prior releases, without crashing the extension process. Request: Please clarify if WKWebView usage inside extensions is officially unsupported as of iOS 26, and if so, recommend an alternative approach for handling SSO flows.

Answered by DTS Engineer in 864595022

Oi vey! You’re calling WKWebView from a secondary thread:

Thread 4 Crashed:
…
7  WebKit                   … -[WKWebView loadRequest:] + 160
8  SSOExtension.debug.dylib … closure #1 in closure #2 in AuthenticationViewController.beginAuthorization(with:) + 2132
9  SSOExtension.debug.dylib … ChallengeApiHelper.performChallengeApiRequest(authorizationRequest:deviceId:completionHandler:) + 1952
10 SSOExtension.debug.dylib … closure #2 in AuthenticationViewController.beginAuthorization(with:) + 2012
11 SSOExtension.debug.dylib … thunk for @escaping @callee_guaranteed @Sendable (@unowned Bool, @guaranteed Error?) -> () + 132
12 AppSSO                   … __81-[SOAuthorizationRequest presentAuthorizationViewControllerWithHints:completion:]_block_invoke + 248

That’s so not allowed, and it’s triggering a trap that crashes your process.

Weirdly, the WebKit Features for Safari 26.1 blog post lists this:

  • Fixed a crash when an app uses WKWebView::loadRequest API on background threads. (162225842)

So clearly you’re not the only one doing this O-: However, that still doesn’t make it right, and you need to fix your code.

Looking at how you got here, frame 10 seems to be key. This symbolicated as closure #2 in AuthenticationViewController.beginAuthorization(with:) + 2012. Now, beginAuthorization(with:) is documented to be called on the main thread. However, this isn’t that method per se, but rather a closure within that method. So, something inside that method is calling a system whose completion handler is being called on a secondary thread.

Based on frame 12, I suspect that’s your call to the presentAuthorizationViewController(completion:) method. It’s completion handler is not documented to be called on the main thread, and I think that’s the root cause of your problem here: In that completion handler you need to bounce to the main thread before calling WebKit.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Hmmm, this is the second question I’ve seen about SAML-based SSO in the past week. Are you working on the same product as francisaugustomedeiros over in SAML with SSO extension triggering twice? Or is this just a coincidence?

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Just a coincidence — I’m not working on the same product. We’re loading the SAML request into a WebView in our extension, and it’s crashing.

Wow, that’s quite a coincidence. One gets no interesting App SSO questions for years, and then two come by that both mention SAML!

Anyway, let’s dig into your issue. Earlier you wrote:

the extension consistently crashes when calling WKWebView.load(_:)

Please post a full Apple crash report for this. See Posting a Crash Report for hints and tips on how to do that.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Please find the crash report attached-

Please clarify if WKWebView usage inside extensions is officially unsupported as of iOS 26, and if so, recommend an alternative approach for handling SSO flows.

Oi vey! You’re calling WKWebView from a secondary thread:

Thread 4 Crashed:
…
7  WebKit                   … -[WKWebView loadRequest:] + 160
8  SSOExtension.debug.dylib … closure #1 in closure #2 in AuthenticationViewController.beginAuthorization(with:) + 2132
9  SSOExtension.debug.dylib … ChallengeApiHelper.performChallengeApiRequest(authorizationRequest:deviceId:completionHandler:) + 1952
10 SSOExtension.debug.dylib … closure #2 in AuthenticationViewController.beginAuthorization(with:) + 2012
11 SSOExtension.debug.dylib … thunk for @escaping @callee_guaranteed @Sendable (@unowned Bool, @guaranteed Error?) -> () + 132
12 AppSSO                   … __81-[SOAuthorizationRequest presentAuthorizationViewControllerWithHints:completion:]_block_invoke + 248

That’s so not allowed, and it’s triggering a trap that crashes your process.

Weirdly, the WebKit Features for Safari 26.1 blog post lists this:

  • Fixed a crash when an app uses WKWebView::loadRequest API on background threads. (162225842)

So clearly you’re not the only one doing this O-: However, that still doesn’t make it right, and you need to fix your code.

Looking at how you got here, frame 10 seems to be key. This symbolicated as closure #2 in AuthenticationViewController.beginAuthorization(with:) + 2012. Now, beginAuthorization(with:) is documented to be called on the main thread. However, this isn’t that method per se, but rather a closure within that method. So, something inside that method is calling a system whose completion handler is being called on a secondary thread.

Based on frame 12, I suspect that’s your call to the presentAuthorizationViewController(completion:) method. It’s completion handler is not documented to be called on the main thread, and I think that’s the root cause of your problem here: In that completion handler you need to bounce to the main thread before calling WebKit.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

WKWebView crashes in SSO App Extension on iOS 26 during loadRequest
 
 
Q