Summary
Any time I try to mutate the cache, my app immediately crashes. It is always crashing at the same spot (line 153 of ApolloStore.swift).
Version
1.21.0
Steps to reproduce the behavior
- Run app on simulator or real device
- Execute any function that will mutate the cache
Minimum Deployments:
iOS 18.2
macOS 15.2
Currently running on Xcode 16.3
Below are some implementation details:
Client
private(set) lazy var apollo: ApolloClient = {
let client = URLSessionClient()
let cache = InMemoryNormalizedCache()
let store = ApolloStore(cache: cache)
let provider = NetworkInterceptorProvider(client: client, store: store)
let url = URL(string: AppInfo.defaultServer)!
let transport = RequestChainNetworkTransport(interceptorProvider: provider, endpointURL: url)
return ApolloClient(networkTransport: transport, store: store)
}()
Apollo Interceptor
class apolloInterceptorClassName: ApolloInterceptor {
public var id: String = UUID().uuidString
func interceptAsync<Operation>(
chain: RequestChain,
request: HTTPRequest<Operation>,
response: HTTPResponse<Operation>?,
completion: @escaping (Result<GraphQLResult<Operation.Data>, Error>) -> Void
) where Operation : GraphQLOperation {
if let token = Keychain.shared.keychain.get(AppInfo.userTokenKey) {
request.addHeader(name: "Authorization", value: token)
}
print(request.additionalHeaders)
chain.proceedAsync(
request: request,
response: response,
interceptor: self,
completion: completion)
}
}
class interceptorProviderClassName: DefaultInterceptorProvider {
override func interceptors<Operation>(for operation: Operation) -> [ApolloInterceptor] where Operation : GraphQLOperation {
var interceptors = super.interceptors(for: operation)
interceptors.insert(AuthorizationInterceptor(), at: 0)
return interceptors
}
}
Schema Configuration
public enum SchemaConfiguration: ApolloAPI.SchemaConfiguration {
public static func cacheKeyInfo(for type: ApolloAPI.Object, object: ApolloAPI.ObjectData) -> CacheKeyInfo? {
switch type {
default:
guard let id = object["id"] as? Int else {
return nil
}
return CacheKeyInfo(id: String(id), uniqueKeyGroup: type.typename)
// return try? CacheKeyInfo(jsonValue: object["id"])
}
}
}
Mutable Fragment Definition
fragment MutableMediaDetails on Media
@apollo_client_ios_localCacheMutation {
id
isFavourite
}
I am able to fetch the data fine. When I perform the mutation, the data is updating on the server correctly, but after completing the mutation and I try to update the cache, the app crashes immediately.
ApolloStore.swift line 153 crash
public func withinReadWriteTransaction<T>(
_ body: @escaping (ReadWriteTransaction) throws -> T,
callbackQueue: DispatchQueue? = nil,
completion: ((Result<T, any Swift.Error>) -> Void)? = nil
) {
self.queue.async(flags: .barrier) {
do {
let returnValue = try body(ReadWriteTransaction(store: self)) <-- CRASHES HERE!!
DispatchQueue.returnResultAsyncIfNeeded(
on: callbackQueue,
action: completion,
result: .success(returnValue)
)
} catch {
DispatchQueue.returnResultAsyncIfNeeded(
on: callbackQueue,
action: completion,
result: .failure(error)
)
}
}
}
Logs
Incident Identifier: 36AB5575-0FA0-47F8-BFFC-178E9BFBDCD5
CrashReporter Key: 862f3046fe8fa87903e12b90f3f24ffe48eac51f
Hardware Model: iPhone16,1
Process: [APP_NAME] [903]
Path: /private/var/containers/Bundle/Application/2BC5407E-130B-4C6E-8F82-843226971FA1/[APP_NAME].app/[APP_NAME]
Identifier: --BUNDLE-ID-PREFIX-.[APP_NAME]
Version: 1.0 (1)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: --BUNDLE-ID-PREFIX-.[APP_NAME] [1102]
Date/Time: 2025-01-13 07:18:18.5720 -0800
Launch Time: 2025-01-13 07:11:30.8456 -0800
OS Version: iPhone OS 18.3 (22D5040d)
Release Type: Beta
Baseband Version: 2.40.03
Report Version: 104
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000001036f82a8
Termination Reason: SIGNAL 5 Trace/BPT trap: 5
Terminating Process: exc handler [903]
Triggered by Thread: 6
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 ??? 0x1a6d51850 ???
1 Security 0x1a5ebd1cc der_decode_dictionary + 215
2 Security 0x1a5ebd7ac der_decode_plist + 1163
3 Security 0x1a5ebd1cc der_decode_dictionary + 215
4 Security 0x1a5ebd7ac der_decode_plist + 1163
5 Security 0x1a5ebd76c der_decode_plist + 1099
6 Security 0x1a5ebd1cc der_decode_dictionary + 215
7 Security 0x1a5ebd7ac der_decode_plist + 1163
8 Security 0x1a5ff3854 CFPropertyListCreateWithDERData + 95
9 Security 0x1a5fe8cbc SecTrustDeserialize + 55
10 WebKit 0x1b4108574 IPC::ArgumentCoder<WTF::RetainPtr<__SecTrust*>, void>::decode(IPC::Decoder&) + 123
11 WebKit 0x1b34b316c std::__1::optional<WTF::RetainPtr<__SecTrust*>> IPC::Decoder::decode<WTF::RetainPtr<__SecTrust*>>() + 27
12 WebKit 0x1b41111b0 std::__1::optional<std::__1::optional<WebKit::CoreIPCNSURLProtectionSpace>> IPC::ArgumentCoder<std::__1::optional<WebKit::CoreIPCNSURLProtectionSpace>, void>::decode<IPC::Decoder>(IPC::Decoder&) + 227
13 WebKit 0x1b40fe37c std::__1::optional<std::__1::optional<WebKit::CoreIPCNSURLProtectionSpace>> IPC::Decoder::decode<std::__1::optional<WebKit::CoreIPCNSURLProtectionSpace>>() + 27
14 WebKit 0x1b40fe2cc std::__1::optional<WTF::RetainPtr<objc_object*>> IPC::decodeObjectDirectlyRequiringAllowedClasses<NSURLProtectionSpace>(IPC::Decoder&) + 31
15 WebKit 0x1b34b5b4c IPC::ArgumentCoder<WebCore::AuthenticationChallenge, void>::decode(IPC::Decoder&) + 311
16 WebKit 0x1b343c8ac std::__1::optional<WebCore::AuthenticationChallenge> IPC::Decoder::decode<WebCore::AuthenticationChallenge>() + 27
17 WebKit 0x1b3624bc8 WebKit::NetworkProcessProxy::didReceiveNetworkProcessProxyMessage(IPC::Connection&, IPC::Decoder&) + 4595
18 WebKit 0x1b32c46f0 IPC::Connection::dispatchMessage(WTF::UniqueRef<IPC::Decoder>) + 251
19 WebKit 0x1b32c449c WTF::Detail::CallableWrapper<IPC::Connection::enqueueIncomingMessage(WTF::UniqueRef<IPC::Decoder>)::$_2, void>::call() + 123
20 JavaScriptCore 0x1b4715158 WTF::RunLoop::performWork() + 203
21 JavaScriptCore 0x1b471506c WTF::RunLoop::performWork(void*) + 35
22 CoreFoundation 0x19d810f4c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 27
23 CoreFoundation 0x19d810ee0 __CFRunLoopDoSource0 + 175
24 CoreFoundation 0x19d813b40 __CFRunLoopDoSources0 + 243
25 CoreFoundation 0x19d812d3c __CFRunLoopRun + 839
26 CoreFoundation 0x19d865284 CFRunLoopRunSpecific + 587
27 GraphicsServices 0x1eaab14c0 GSEventRunModal + 163
28 UIKitCore 0x1a03b3350 -[UIApplication _run] + 815
29 UIKitCore 0x19ffd9184 UIApplicationMain + 339
30 SwiftUI 0x1a2170eb0 closure #1 in KitRendererCommon(_:) + 167
31 SwiftUI 0x1a2170de0 runApp<A>(_:) + 99
32 SwiftUI 0x1a2170cc4 static App.main() + 179
33 [APP_NAME].debug.dylib 0x105968070 static [APP_NAME]App.$main() + 40
34 [APP_NAME].debug.dylib 0x105968e90 __debug_main_executable_dylib_entry_point + 12
35 dyld 0x1c3aa5de8 start + 2723
Thread 1 name: com.apple.uikit.eventfetch-thread
Thread 1:
0 libsystem_kernel.dylib 0x1eeeb4788 mach_msg2_trap + 8
1 libsystem_kernel.dylib 0x1eeeb7e98 mach_msg2_internal + 79
2 libsystem_kernel.dylib 0x1eeeb7db0 mach_msg_overwrite + 423
3 libsystem_kernel.dylib 0x1eeeb7bfc mach_msg + 23
4 CoreFoundation 0x19d813804 __CFRunLoopServiceMachPort + 159
5 CoreFoundation 0x19d812eb0 __CFRunLoopRun + 1211
6 CoreFoundation 0x19d865284 CFRunLoopRunSpecific + 587
7 Foundation 0x19c3e6908 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 211
8 Foundation 0x19c543310 -[NSRunLoop(NSRunLoop) runUntilDate:] + 63
9 UIKitCore 0x1a0446978 -[UIEventFetcher threadMain] + 419
10 Foundation 0x19c4d26a0 __NSThread__start__ + 723
11 libsystem_pthread.dylib 0x2285057d0 _pthread_start + 135
12 libsystem_pthread.dylib 0x228505480 thread_start + 7
Thread 2 name: com.apple.NSURLConnectionLoader
Thread 2:
0 libsystem_kernel.dylib 0x1eeeb44e4 kevent_id + 8
1 libdispatch.dylib 0x10371a96c _dispatch_kq_poll + 228
2 libdispatch.dylib 0x103719e78 _dispatch_event_loop_poke + 340
3 CFNetwork 0x19ed85778 DiskCookieStorage::syncStorageWithCompletionLocked(unsigned char, void () block_pointer) + 4407
4 CFNetwork 0x19ed84608 HTTPCookieStorage::syncStorageWithCompletion(unsigned char, void () block_pointer) + 183
5 CFNetwork 0x19ee83598 HTTPCookieStorage::_syncTimerFired(__CFRunLoopTimer*, void*) + 147
6 CoreFoundation 0x19d88d29c __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 31
7 CoreFoundation 0x19d88cf40 __CFRunLoopDoTimer + 1011
8 CoreFoundation 0x19d88ca94 __CFRunLoopDoTimers + 287
9 CoreFoundation 0x19d813134 __CFRunLoopRun + 1855
10 CoreFoundation 0x19d865284 CFRunLoopRunSpecific + 587
11 CFNetwork 0x19ed8adfc +[__CFN_CoreSchedulingSetRunnable _run:] + 415
12 Foundation 0x19c4d26a0 __NSThread__start__ + 723
13 libsystem_pthread.dylib 0x2285057d0 _pthread_start + 135
14 libsystem_pthread.dylib 0x228505480 thread_start + 7
Thread 3:
0 libsystem_pthread.dylib 0x22850546c start_wqthread + 0
Thread 4:
0 JavaScriptCore 0x1b451bdc0 bmalloc_small_segregated_page_config_specialized_local_allocator_return_memory_to_page + 4452
1 JavaScriptCore 0x1b4519b8c pas_local_allocator_stop + 591
2 JavaScriptCore 0x1b5a842e0 pas_thread_local_cache_stop_local_allocators + 467
3 JavaScriptCore 0x1b5a84064 destructor + 191
4 libsystem_pthread.dylib 0x228508fc4 _pthread_tsd_cleanup + 619
5 libsystem_pthread.dylib 0x228508d34 _pthread_exit + 83
6 libsystem_pthread.dylib 0x228508ce0 _pthread_wqthread_exit + 55
7 libsystem_pthread.dylib 0x228507708 _pthread_wqthread + 423
8 libsystem_pthread.dylib 0x228505474 start_wqthread + 7
Thread 5 name: Dispatch queue: com.apple.network.connections
Thread 5:
0 libsystem_kernel.dylib 0x1eeeb44e4 kevent_id + 8
1 libdispatch.dylib 0x10371a96c _dispatch_kq_poll + 228
2 libdispatch.dylib 0x10371a47c _dispatch_kq_drain + 164
3 libdispatch.dylib 0x10371a334 _dispatch_event_loop_drain + 344
4 libdispatch.dylib 0x103700ca4 _dispatch_workloop_invoke + 2912
5 libdispatch.dylib 0x10370c6fc _dispatch_root_queue_drain_deferred_wlh + 328
6 libdispatch.dylib 0x10370bd0c _dispatch_workloop_worker_thread + 580
7 libsystem_pthread.dylib 0x228507680 _pthread_wqthread + 287
8 libsystem_pthread.dylib 0x228505474 start_wqthread + 7
Thread 6 name: Dispatch queue: com.apollographql.ApolloStore
Thread 6 Crashed:
0 libdispatch.dylib 0x1036f82a8 _dispatch_assert_queue_fail + 120
1 libdispatch.dylib 0x1036f8230 dispatch_assert_queue + 196
2 libswift_Concurrency.dylib 0x1a90f3b78 swift_task_isCurrentExecutorImpl(swift::SerialExecutorRef) + 283
3 [APP_NAME].debug.dylib 0x105e96d38 closure #1 in closure #1 in DataService.updateCache(id:) + 208
4 [APP_NAME].debug.dylib 0x105e97e88 partial apply for closure #1 in closure #1 in DataService.updateCache(id:) + 96
5 [APP_NAME].debug.dylib 0x105eb3350 closure #1 in ApolloStore.withinReadWriteTransaction<A>(_:callbackQueue:completion:) + 324
6 [APP_NAME].debug.dylib 0x105eaf264 thunk for @escaping @callee_guaranteed @Sendable () -> () + 48
7 libdispatch.dylib 0x1036f488c _dispatch_call_block_and_release + 32
8 libdispatch.dylib 0x1036f6578 _dispatch_client_callout + 20
9 libdispatch.dylib 0x103709920 _dispatch_lane_concurrent_drain + 1144
10 libdispatch.dylib 0x1036ff2cc _dispatch_lane_invoke + 520
11 libdispatch.dylib 0x1036f8ed0 _dispatch_queue_override_invoke + 564
12 libdispatch.dylib 0x10370ad34 _dispatch_root_queue_drain + 404
13 libdispatch.dylib 0x10370b724 _dispatch_worker_thread2 + 188
14 libsystem_pthread.dylib 0x228507644 _pthread_wqthread + 227
15 libsystem_pthread.dylib 0x228505474 start_wqthread + 7
Thread 7:
0 libsystem_pthread.dylib 0x228505478 thread_start + 0
Thread 8:
0 libsystem_pthread.dylib 0x22850546c start_wqthread + 0
Thread 9:
0 libsystem_pthread.dylib 0x22850546c start_wqthread + 0
Thread 10:
0 libsystem_pthread.dylib 0x22850546c start_wqthread + 0
Thread 6 crashed with ARM Thread State (64-bit):
x0: 0x00000003013c1e90 x1: 0x0000000000000000 x2: 0x0000000000000000 x3: 0x00000003013c1ec0
x4: 0x00000003013c1f00 x5: 0x0000000000000000 x6: 0x0068637461707369 x7: 0x00000003013c1e80
x8: 0x000000010375d000 x9: 0x000000009d827847 x10: 0x000000000000007f x11: 0x0000000000001e80
x12: 0x00000000000007fb x13: 0x00000000000007fd x14: 0x000000009da2803e x15: 0x000000009d827847
x16: 0x000000009da00000 x17: 0x000000000000003e x18: 0x0000000000000000 x19: 0x00000003013c1a80
x20: 0x0000000000000000 x21: 0x0000000000000000 x22: 0x0000000000030000 x23: 0x0000000000000000
x24: 0x000000016d31f0e0 x25: 0x0000000302832bc0 x26: 0x0000000105eaf234 x27: 0x00000001036f486c
x28: 0x0000000000000000 fp: 0x000000016d31e900 lr: 0x12710001036f82a0
sp: 0x000000016d31e8c0 pc: 0x00000001036f82a8 cpsr: 0x60001000
far: 0x0000000000000000 esr: 0xf2000001 (Breakpoint) brk 1
Binary Images:
0x102b68000 - 0x102b73fff [APP_NAME] arm64 <a4b35b6baa1f3139bd9776c2b53ecb38> /private/var/containers/Bundle/Application/2BC5407E-130B-4C6E-8F82-843226971FA1/[APP_NAME].app/[APP_NAME]
0x102b9c000 - 0x102b9ffff libLogRedirect.dylib arm64e <f3df4371d9443962a606105bcd98e59c> /private/preboot/Cryptexes/OS/usr/lib/libLogRedirect.dylib
0x102bc8000 - 0x102bcffff libBacktraceRecording.dylib arm64e <9eebd0670d033b06b7352d123df1db47> /usr/lib/libBacktraceRecording.dylib
0x102e40000 - 0x102e83fff libMainThreadChecker.dylib arm64e <e5b5ad82f2d333eba9e5e77d9717c883> /usr/lib/libMainThreadChecker.dylib
0x102f94000 - 0x10302ffff libRPAC.dylib arm64e <eed646837af13125a1a480b92c861f8d> /usr/lib/libRPAC.dylib
0x10364c000 - 0x103683fff libViewDebuggerSupport.dylib arm64e <106f191cdd1f3916b3edf5e412ff5a7d> /usr/lib/libViewDebuggerSupport.dylib
0x10595c000 - 0x10674ffff [APP_NAME].debug.dylib arm64 <96793e28476638ccaa6844cfe83b79a5> /private/var/containers/Bundle/Application/2BC5407E-130B-4C6E-8F82-843226971FA1/[APP_NAME].app/[APP_NAME].debug.dylib
0x1036f0000 - 0x10373ffff libdispatch.dylib arm64e <68af15bba53535629ed4f412272247ba> /usr/lib/system/introspection/libdispatch.dylib
0x103794000 - 0x1037b7fff DebugHierarchyFoundation arm64e <ac5bebfc476732359dd12862df05724c> /System/Library/PrivateFrameworks/DebugHierarchyFoundation.framework/DebugHierarchyFoundation
0x10497c000 - 0x104987fff libobjc-trampolines.dylib arm64e <4aba9420e4d03c989d62c653b259eab4> /private/preboot/Cryptexes/OS/usr/lib/libobjc-trampolines.dylib
0x0 - 0xffffffffffffffff ??? unknown-arch <00000000000000000000000000000000> ???
0x1a5eb8000 - 0x1a608cfff Security arm64e <946637c39834347e98c8f7219aadb9ef> /System/Library/Frameworks/Security.framework/Security
0x1b323d000 - 0x1b4344fff WebKit arm64e <5619324d2d0d322a84f6856484da9738> /System/Library/Frameworks/WebKit.framework/WebKit
0x1b441c000 - 0x1b5c53fdf JavaScriptCore arm64e <690b3848a0eb35b29ff6c347fbccff84> /System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore
0x19d79d000 - 0x19dce0fff CoreFoundation arm64e <0013a8b125243534b5ba681aaf18c798> /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
0x1eaab0000 - 0x1eaab8fff GraphicsServices arm64e <d09b841af83c3dbcafc1ad9dab5d5fe1> /System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices
0x19ffc4000 - 0x1a1edefff UIKitCore arm64e <404ac345125c3fe48e608952d037927b> /System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore
0x1a1edf000 - 0x1a31a8fff SwiftUI arm64e <ee20cce9a10b3a05b39aaa7466b54873> /System/Library/Frameworks/SwiftUI.framework/SwiftUI
0x1c3a76000 - 0x1c3af913f dyld arm64e <c6ab7bed0bd23c6fa0213f8f22b57d1a> /usr/lib/dyld
0x1eeeb3000 - 0x1eeeecff3 libsystem_kernel.dylib arm64e <256c8b11269d34799221edc0e6284dac> /usr/lib/system/libsystem_kernel.dylib
0x19c3bd000 - 0x19d0d1fff Foundation arm64e <8e14980c8d863c93965ce3a1d761a45a> /System/Library/Frameworks/Foundation.framework/Foundation
0x228504000 - 0x228510ff3 libsystem_pthread.dylib arm64e <80ce8691d74734f2a720a2b76bf4148b> /usr/lib/system/libsystem_pthread.dylib
0x1a55a6000 - 0x1a5625ffb libsystem_c.dylib arm64e <4065a8811de03b378e7699600361e0d8> /usr/lib/system/libsystem_c.dylib
0x19ec99000 - 0x19f05dfff CFNetwork arm64e <5f93dbabb5b3379fbbef2320505615e3> /System/Library/Frameworks/CFNetwork.framework/CFNetwork
0x228458000 - 0x22845fff3 libsystem_platform.dylib arm64e <def0b18b9b0a3ed3a4876171c6d9b127> /usr/lib/system/libsystem_platform.dylib
0x1a9091000 - 0x1a9113fff libswift_Concurrency.dylib arm64e <01ad2d3e16d2374da565e3f1961013d4> /usr/lib/swift/libswift_Concurrency.dylib
EOF
Anything else?
I posted about this in the Apollo Community but received zero replies.
Summary
Any time I try to mutate the cache, my app immediately crashes. It is always crashing at the same spot (line 153 of ApolloStore.swift).
Version
1.21.0
Steps to reproduce the behavior
Minimum Deployments:
iOS 18.2
macOS 15.2
Currently running on Xcode 16.3
Below are some implementation details:
Client
Apollo Interceptor
Schema Configuration
Mutable Fragment Definition
I am able to fetch the data fine. When I perform the mutation, the data is updating on the server correctly, but after completing the mutation and I try to update the cache, the app crashes immediately.
ApolloStore.swift line 153 crash
Logs
Anything else?
I posted about this in the Apollo Community but received zero replies.