Hi,
We are seeing watchdog-terminated app hangs reported by users on iOS 26. The hang occurs during cold launch when we set the Game Center authenticate handler. Our usage is straightforward — we follow the official guide: to set the handler once in the boot flow.
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){//handler code}
The app never reaches our handler code. Instead, it is killed by the watchdog before the handler is invoked.
Root Cause:
We believe the root cause is GKDaemonProxy localPlayerAgeCategory makes a synchronous XPC call ( xpc_connection_send_message_with_reply_sync ) to the Game Center daemon ( com.apple.gamed ). The daemon does not respond, blocking the main thread indefinitely until the watchdog terminates the app. Also we haven't seen this before iOS 26.
Reproduction Conditions:
Unfortunately we don't have a consistent way to reproduce it. It happens intermittently. And I can't share the iOS build due to company requirements. I have pasted the stack trace below (all users report the similar stack tracks).
Stack trace (representative, reported consistently across affected users):
App Hang: The app was terminated while unresponsive
0 libsystem_kernel.dylib +0xcd0 _mach_msg2_trap
1 libsystem_kernel.dylib +0x4308 _mach_msg2_internal
2 libsystem_kernel.dylib +0x4228 _mach_msg_overwrite
3 libsystem_kernel.dylib +0x4074 _mach_msg
4 libdispatch.dylib +0x1c980 __dispatch_mach_send_and_wait_for_reply
5 libdispatch.dylib +0x1cd20 _dispatch_mach_send_with_result_and_wait_for_reply
6 libxpc.dylib +0x11ed8 _xpc_connection_send_message_with_reply_sync
7 Foundation +0x41710 ___NSXPCCONNECTION_IS_WAITING_FOR_A_SYNCHRONOUS_REPLY__
8 Foundation +0x29068 -[NSXPCConnection _sendInvocation:orArguments:count:methodSignature:selector:withProxy:]
9 Foundation +0x69b7c -[NSXPCConnection _sendSelector:withProxy:arg1:]
10 Foundation +0x699e8 __NSXPCDistantObjectSimpleMessageSend1
11 GameCenterFoundation +0x986fc ___39-[GKDaemonProxy localPlayerAgeCategory]_block_invoke.109
12 GameCenterFoundation +0x1397d0 0x22cbde7d0 (0x22cbde794 + 60)
13 GameCenterFoundation +0x139610 0x22cbde610 (0x22cbde508 + 264)
14 GameCenterFoundation +0x139770 0x22cbde770 (0x22cbde6ec + 132)
15 GameCenterFoundation +0x98420 -[GKDaemonProxy localPlayerAgeCategory]
16 GameCenterFoundation +0x2ceb4 -[GKClientPreferencesSupport localPlayerAgeCategory]
17 GameCenterFoundation +0x93ba4 -[GKPreferences(AgeCategoryRestrictions) localPlayerAgeCategory]
18 GameCenterFoundation +0x93c34 -[GKPreferences(AgeCategoryRestrictions) getRestrictionLimitForLocalPlayer:]
19 GameCenterFoundation +0x93cd0 -[GKPreferences(AgeCategoryRestrictions) clampBoolRestriction:tableEntry:]
20 GameCenterFoundation +0x93d40 -[GKPreferences(AgeCategoryRestrictions) isBoolValueRestricted:tableEntry:]
21 GameCenterFoundation +0x9f7b8 -[GKPreferences(Restrictions) isBoolKeyRestricted:category:]
22 GameCenterUICore +0x2d04 -[GKLocalPlayerAuthenticator _authenticateUsingAuthUI:authenticationResults:usernameEditable:authUIDismissHandler:completionHandler:]
23 GameCenterUICore +0xd638 ___106-[GKLocalPlayer(AuthenticationPrivate) startAuthenticationForExistingPrimaryPlayerUponReturnToForeground:]_block_invoke
24 libsystem_trace.dylib +0xdb40 _os_activity_apply_f
25 GameCenterFoundation +0x181f4 -[GKActivity execute:]
26 GameCenterFoundation +0x18138 +[GKActivity named:execute:]
27 GameCenterUICore +0xd528 -[GKLocalPlayer(AuthenticationPrivate) startAuthenticationForExistingPrimaryPlayerUponReturnToForeground:]
28 libsystem_trace.dylib +0xdb40 _os_activity_apply_f
29 GameCenterFoundation +0x181f4 -[GKActivity execute:]
30 GameCenterFoundation +0x18138 +[GKActivity named:execute:]
31 GameCenterFoundation +0x4f124 ___40-[GKLocalPlayer setAuthenticateHandler:]_block_invoke
32 libdispatch.dylib +0x1b1e0 __dispatch_client_callout
33 libdispatch.dylib +0x45ac __dispatch_once_callout
34 GameCenterFoundation +0x4f070 -[GKLocalPlayer setAuthenticateHandler:]
Additional Notes:
This issue was not observed prior to iOS 26. We have no reports of this on iOS 17 or iOS 18.
We are unable to share a build due to company policy.
We cannot reproduce this consistently — it occurs intermittently in production.
All affected users report the same stack trace pattern.
0
0
19