We're seeing a crash from a user on iOS 27.2 that we can't reproduce locally. The crash shows swift_unexpectedError on the main thread with no application frames between the concurrency runtime and the crash.
Our app binary hasn't changed since summer 2025 but this user started experiencing the crash for the first time about a week ago.
Thread 0 (crashed):
Thread 0 Crashed (com.apple.main-thread):
0 libswiftCore.dylib _assertionFailure(_:_:file:line:flags:)
1 libswiftCore.dylib swift_unexpectedError
2 libswift_Concurrency.dylib swift::runJobInEstablishedExecutorContext(...)
3 libswift_Concurrency.dylib swift_job_runImpl(...)
4 libdispatch.dylib _dispatch_main_queue_drain
5 libdispatch.dylib _dispatch_main_queue_callback_4CF
6 CoreFoundation __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
... (standard UIApplicationMain run loop)
The crash occurs 0.45 seconds after launch. The only other active thread at the time of the crash is Thread 6, which shows TipKit driving SwiftData/CoreData work:
Thread 6:
Thread 6 name: Dispatch queue: NSManagedObjectContext 0x110f99500
0 CoreFoundation CFBasicHashGetPtrIndex
1 CoreFoundation CFBasicHashCreate
2 CoreFoundation CFDictionaryCreateMutable
3 CoreData _PFCMT_SetValue
4 CoreData -[NSManagedObjectContext _retainedObjectWithID:optionalHandler:withInlineStorage:]
5 CoreData -[NSManagedObjectContext objectWithID:]
6 SwiftData (SwiftData + 373080)
7 SwiftData (SwiftData + 281172)
8 SwiftData (SwiftData + 359244)
9 SwiftData (SwiftData + 355724)
10 SwiftData (SwiftData + 359208)
11 CoreData thunk for @callee_guaranteed () -> (@out A, @error @owned Error)
12 CoreData partial apply for thunk for @callee_guaranteed () -> (@out A, @error @owned Error)
13 CoreData NSManagedObjectContext._rethrowsHelper_performAndWait(...)
14 CoreData thunk for @callee_guaranteed @Sendable () -> ()
15 CoreData thunk for @escaping @callee_guaranteed @Sendable () -> ()
16 CoreData developerSubmittedBlockToNSManagedObjectContextPerform
17 libdispatch.dylib _dispatch_client_callout
18 libdispatch.dylib _dispatch_lane_barrier_sync_invoke_and_complete
19 CoreData -[NSManagedObjectContext performBlockAndWait:]
20 CoreData NSManagedObjectContext.performAndWait(_:)
21 SwiftData (SwiftData + 258584)
22 SwiftData (SwiftData + 257920)
23 SwiftData (SwiftData + 326480)
24 SwiftData (SwiftData + 259564)
25 SwiftData (SwiftData + 56292)
26 SwiftData (SwiftData + 385736)
27 TipKitCore (TipKitCore + 202216)
28 TipKitCore (TipKitCore + 128232)
29 TipKitCore (TipKitCore + 124104)
30 TipKitCore (TipKitCore + 130048)
31 TipKitCore (TipKitCore + 241553)
32 TipKitCore (TipKitCore + 152365)
33 TipKitCore (TipKitCore + 134441)
34 TipKitCore (TipKitCore + 152629)
35 TipKitCore (TipKitCore + 134233)
36 TipKitCore (TipKitCore + 134441)
37 TipKitCore (TipKitCore + 138237)
38 TipKitCore (TipKitCore + 134233)
39 libswift_Concurrency completeTask(swift::AsyncContext*, swift::SwiftError*)
All other threads are idle.
Context:
- We call
try? Tips.configure([.displayFrequency(.hourly)])early in our startup sequence. Thetry?should swallow any error fromconfigureitself, but I'm not sure if TipKit spawns its own internal async tasks. - Our app uses UIKit (not SwiftUI App lifecycle). We do not use SwiftData directly — any SwiftData/CoreData frames come from system frameworks.
- The binary hasn't changed since summer 2025, so this appears to be an OS-level regression on iOS 27.x.
- We cannot reproduce locally.
Questions:
- Is there a way to get async backtraces in crash reports from the field, or is this only possible under the debugger?
- If TipKit spawns an internal
Taskthat throws into a non-throwing context, would that produce exactly this crash pattern —swift_unexpectedErroron the main thread with no third-party frames? - Are there known issues with TipKit's internal SwiftData tasks crashing on iOS 27.x?
Any guidance on narrowing this down without a local repro would be appreciated.