Firestore addSnapshotListener constantly consuming 100% CPU
Description
The code
let listener = db.collection("users").document(uid).addSnapshotListener { documentSnapshot, error in
Consumes 100% CPU on one thread all the time my app is open (I can use the pause button in the debugger and I'll see in the call stack of that thread that it's stuck in there).
From what I can tell from the logs it seems to be stuck in an infinite update loop, but my app isn't updating that Firestore entry. It's continuously processing updates of that object it seems, but the closure is never called with an updated document. I checked the server and there are no Firebase functions running constantly, and none of them are stuck in a loop as they would time out after 1 minute.
In the (infinite) logs the batch_id numbers are always the same. I don't know if that gives a clue to what's going on?
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Acknowledge batch: 10 changes (3508 bytes):
- Delete [document_mutation: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2 batch_id=2939]
- Delete [mutation: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 **batch_id=2939**]
- Put [document_overlays: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2 batch_id=17110] (2109 bytes)
- Put [document_overlays_collection_group_index: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 collection_group=users batch_id=17110 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)
- Put [document_overlays_collection_index: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 path=users **batch_id=17110** document_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)
- Put [document_overlays_largest_batch_id_index: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 **batch_id=17110** path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)
- Put [document_target: path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2 target_id=0] (3 bytes)
- Put [mutation_queue: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (14 bytes)
- Put [remote_document: path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2] (1382 bytes)
- Put [remote_document_read_time: path=users snapshot_version=Timestamp(seconds=1739999630, nanoseconds=409155000) document_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)>
Reproducing the issue
Simply calling
let listener = db.collection("users").document(uid).addSnapshotListener { documentSnapshot, error in
...}
Firebase SDK Version
11.8.1
Xcode Version
16.2
Installation Method
Swift Package Manager
Firebase Product(s)
Firestore
Targeted Platforms
iOS
Relevant Log Output
11.8.1 - [GoogleUtilities/SceneDelegateSwizzler][I-SWZ001114] Successfully created Scene Delegate Proxy automatically. To disable the proxy, set the flag GoogleUtilitiesAppDelegateProxyEnabled to NO (Boolean) in the Info.plist
11.8.1 - [GULReachability][I-REA902004] Network status has changed. Code:2, status:Connected
11.8.1 - [GULReachability][I-REA902004] Network status has changed. Code:2, status:Connected
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseInstallations][I-FIS002001] -[FIRInstallationsIDController installationWithValidAuthTokenForcingRefresh:0], appName: __FIRAPP_DEFAULT
11.8.1 - [FirebaseCore][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
11.8.1 - [FirebaseMessaging][I-FCM042001] Invalidating cached token due to Firebase App IID change from 1:574424094871:ios:c93b530be2114bb33c71d2 to (null)
11.8.1 - [FirebaseMessaging][I-FCM034012] Invalidating cached token for 574424094871 (*) due to token is no longer fresh.
11.8.1 - [FirebaseAuth][I-AUT000002] Token auto-refresh enabled.
11.8.1 - [FirebaseAuth][I-AUT000004] Token auto-refresh scheduled in 42:21 for the new token.
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [GULReachability][I-REA902004] Network status has changed. Code:2, status:Connected
11.8.1 - [FirebaseAuth][I-AUT000011] Provisioning profile has specifically provisioned devices, most likely a Dev profile.
11.8.1 - [FirebaseAuth][I-AUT000012] APNS Environment in profile: development
11.8.1 - [FirebaseMessaging][I-FCM023012] Provisioning profile has specifically provisioned devices, most likely a Dev profile.
11.8.1 - [FirebaseMessaging][I-FCM023013] APNS Environment in profile: development
11.8.1 - [FirebaseSessions][I-SES000000] Data Collection is enabled for at least one Subscriber
11.8.1 - [FirebaseAnalytics][I-ACS023016] Analytics is ready to receive events
11.8.1 - [FirebaseSessions][I-SES000000] [Settings] Cache is not expired, no fetch will be made.
11.8.1 - [FirebaseInstallations][I-FIS002001] -[FIRInstallationsIDController installationWithValidAuthTokenForcingRefresh:0], appName: __FIRAPP_DEFAULT
11.8.1 - [FirebaseInstallations][I-FIS002000] -[FIRInstallationsIDController createGetInstallationItemPromise], appName: __FIRAPP_DEFAULT
11.8.1 - [FirebaseSessions][I-SES000000] Successfully logged Session Start event to GoogleDataTransport
11.8.1 - [FirebaseSessions][I-SES000000] Successfully logged Session Start event
11.8.1 - [FirebaseAnalytics][I-ACS032014] AdServices framework is not linked. Search Ad Attribution Reporter is disabled.
11.8.1 - [FirebaseAnalytics][I-ACS002002] Measurement timer scheduled to fire in approx. (s): -20.43321192264557
11.8.1 - [FirebaseAnalytics][I-ACS002002] Engagement timer scheduled to fire in approx. (s): 3600
11.8.1 - [FirebaseAnalytics][I-ACS023012] Analytics collection enabled
11.8.1 - [FirebaseAnalytics][I-ACS023078] User property removed. Name: user_id (_id)
11.8.1 - [FirebaseAnalytics][I-ACS023078] User property removed. Name: last_advertising_id_reset (_lair)
11.8.1 - [FirebaseAnalytics][I-ACS002001] Measurement timer fired
11.8.1 - [FirebaseAnalytics][I-ACS002003] Measurement timer canceled
11.8.1 - [FirebaseAnalytics][I-ACS900001] Downloading data. Host: https://app-analytics-services.com/config/app/1:574424094871:ios:c93b530be2114bb33c71d2?platform=ios&runtime_version=0&gmp_version=110700
11.8.1 - [FirebaseAnalytics][I-ACS901006] Received SSL challenge for host. Host: https://app-analytics-services.com/config/app/1:574424094871:ios:c93b530be2114bb33c71d2?platform=ios&runtime_version=0&gmp_version=110700
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseAuth][I-AUT000017] Actual token expiration date: Optional(2025-02-19 14:15:39 +0000),current date: 2025-02-19 13:28:18 +0000
"Has authenticated user sebtG8kxEnN7PiBFtykQKtUEdCt2 after get ID token"
11.8.1 - [FirebaseFirestore][I-FST000001] Initializing. Current user: sebtG8kxEnN7PiBFtykQKtUEdCt2
11.8.1 - [FirebaseFirestore][I-FST000001] Using /var/mobile/Containers/Data/Application/DCCF3358-037E-4EA0-B82E-74023940D4AF/Library/Application Support/firestore/__FIRAPP_DEFAULT/sweel-test/main for LevelDB storage
11.8.1 - [FirebaseAnalytics][I-ACS012018] Saving bundle. size (bytes): 510
11.8.1 - [FirebaseAnalytics][I-ACS023116] Bundle added to the upload queue. BundleID, timestamp (ms): 148, 1739971677123
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Start LevelDB: 0 changes (0 bytes):>
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1739971698.941371 1883078 config.cc:230] gRPC experiments enabled: call_status_override_on_cancellation, http2_stats_fix, monitoring_experiment, pick_first_new, trace_record_callops, work_serializer_clears_time_cache
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Start MutationQueue: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Start IndexManager: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction migrate overlays: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) start
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Allocate target: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Using full collection scan to execute query: Query(canonical_id=users/sebtG8kxEnN7PiBFtykQKtUEdCt2|f:|ob:__name__asc)
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction ExecuteQuery: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) start
11.8.1 - [FirebaseAuth][I-AUT000017] Has valid access token. Estimated expiration date:2025-02-19 14:15:39 +0000, current date: 2025-02-19 13:28:18 +0000
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Release target: 2 changes (155 bytes):
- Put [target: target_id=76] (134 bytes)
- Put [target_global:] (21 bytes)>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Allocate target: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Using full collection scan to execute query: Query(canonical_id=users/sebtG8kxEnN7PiBFtykQKtUEdCt2|f:|ob:__name__asc)
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction ExecuteQuery: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Creating Firestore stub.
"Properties listener for user sebtG8kxEnN7PiBFtykQKtUEdCt2 callback"
"Properties listener for user sebtG8kxEnN7PiBFtykQKtUEdCt2 has no error"
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) initial request: <WriteRequest 0x16c5326a8>: {
database: "projects/sweel-test/databases/(default)"
}
nw_endpoint_flow_failed_with_error [C7 2a00:1450:400c:c0b::5f.443 failed parent-flow (unsatisfied (No network route), ipv4, dns)] already failing, returning
nw_connection_get_connected_socket_block_invoke [C7] Client called nw_connection_get_connected_socket on unconnected nw_connection
TCP Conn 0x302db0d20 Failed : error 0:50 [50]
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) watch: <ListenRequest 0x16c532460>: {
database: "projects/sweel-test/databases/(default)"
add_target {
documents {
documents: "projects/sweel-test/databases/(default)/documents/users/sebtG8kxEnN7PiBFtykQKtUEdCt2"
}
resume_token: "\n\t\010\320\306\267\316\353\317\213\003"
target_id: 76
expected_count {
value: 1
}
}
}
I0000 00:00:1739971698.967680 1883086 subchannel.cc:806] subchannel 0x1101bf800 {address=ipv6:%5B2a00:1450:400c:c0b::5f%5D:443, args={grpc.client_channel_factory=0x301e8b3b0, grpc.default_authority=firestore.googleapis.com, grpc.http2_scheme=https, grpc.internal.channel_credentials=0x303880ba0, grpc.internal.client_channel_call_destination=0x10b907c28, grpc.internal.event_engine=0x301ea07e0, grpc.internal.security_connector=0x3032a6b80, grpc.internal.subchannel_pool=0x3037912d0, grpc.keepalive_time_ms=30000, grpc.primary_user_agent=grpc-c++/1.65.1, grpc.resource_quota=0x3013e8990, grpc.server_uri=dns:///firestore.googleapis.com}}: connect failed (UNKNOWN:(domain:NSPOSIXErrorDomain, code:50, description:The operation couldn’t be completed. Network is down) {file:"/var/folders/hn/5bx1f4_d4ds5vhwhkxc7vdcr0000gn/T/ZipRelease/2024-07-25T04-01-28/project-ios/Pods/gRPC-Core/src/core/lib/transport/error_utils.cc", file_line:150, created_time:"2025-02-19T14:28:18.967128+01:00", grpc_status:2}), backing off for 995 ms
11.8.1 - [FirebaseAnalytics][I-ACS023039] Measurement data sent to network. Timestamp (ms), data: 1739971698977, <APMPBMeasurementBatch: 0x301eb5990>
11.8.1 - [FirebaseAnalytics][I-ACS900000] Uploading data. Host: https://region1.app-analytics-services.com/a
11.8.1 - [FirebaseAnalytics][I-ACS901006] Received SSL challenge for host. Host: https://region1.app-analytics-services.com/a
11.8.1 - [FirebaseAnalytics][I-ACS023044] Successful upload. Got network response. Code, size: 204, 0
11.8.1 - [FirebaseAnalytics][I-ACS002002] Measurement timer scheduled to fire in approx. (s): -20.98524105548859
11.8.1 - [FirebaseAnalytics][I-ACS002003] Measurement timer canceled
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) response: <ListenResponse 0x16c276640>: {
target_change {
target_change_type: ADD
target_ids: 76
}
}
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) response: <ListenResponse 0x16c276640>: {
target_change {
resume_token: "\n\t\010\320\306\267\316\353\317\213\003"
read_time {
seconds: 1739971678
nanos: 298960000
}
}
}
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Apply remote event: 1 changes (21 bytes):
- Put [target_global:] (21 bytes)>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NotifyLocalViewChanges: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) response: <WriteResponse 0x16c276668>: {
stream_id: "0"
stream_token: "\031\020hB\002\201\364\265\265"
}
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Set stream token: 1 changes (11 bytes):
- Put [mutation_queue: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (11 bytes)>
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) write request: <WriteRequest 0x16c276568>: {
writes {
update {
name: "projects/sweel-test/databases/(default)/documents/users/sebtG8kxEnN7PiBFtykQKtUEdCt2"
fields {
key: "countryId"
value {
string_value: "BE"
}
}
fields {
key: "currency"
value {
string_value: "EUR"
}
}
fields {
key: "dataSourcesSettings"
value {
map_value {
fields {
key: "detectTripsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importAppleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGarminRidesAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGoogleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importStravaRidesAutomatically"
value {
boolean_value: false
}
}
fields {
key: "uploadRidesToStravaAutomatically"
value {
boolean_value: false
}
}
}
}
}
fields {
key: "distanceUnit"
value {
string_value: "kilometers"
}
}
fields {
key: "employmentStatus"
value {
string_value: "employee"
}
}
fields {
key: "expenseReportConfiguration"
value {
map_value {
fields {
key: "accountableEmailAddress"
value {
null_value: NULL_VALUE
}
}
fields {
key: "daysOfWeek"
value {
array_value {
values {
integer_value: 0
}
values {
integer_value: 1
}
values {
integer_value: 2
}
values {
integer_value: 3
}
values {
integer_value: 4
}
}
}
}
fields {
key: "endHour"
value {
string_value: "19:00"
}
}
fields {
key: "maximalYearlyExpenseAmount"
value {
double_value: 3500
}
}
fields {
key: "reportFrequency"
value {
string_value: "monthly"
}
}
fields {
key: "sendToAccountable"
value {
boolean_value: false
}
}
fields {
key: "sendToWinbooks"
value {
boolean_value: false
}
}
fields {
key: "startHour"
value {
string_value: "07:00"
}
}
fields {
key: "timeZone"
value {
string_value: "Europe/Brussels"
}
}
fields {
key: "unitPrice"
value {
double_value: 0.35
}
}
fields {
key: "uploadToCloud"
value {
boolean_value: false
}
}
fields {
key: "winbooksEmailAddress"
value {
null_value: NULL_VALUE
}
}
}
}
}
fields {
key: "fcmToken"
value {
string_value: "fO4ThKxYQELro8MTMXjRuM:APA91bFAubuxhIv-a_yJPNzm62xGWXietj4JmLpVSJAK1bjx8Pc8c82QF7T_ZKd1eDiVvIGWAV6qSBodT5qNnQqqoNjxoPcP5Toek9YIwVHF8SHIvW91MCg"
}
}
fields {
key: "hasValidPremiumSubscription"
value {
boolean_value: false
}
}
fields {
key: "language"
value {
string_value: "en"
}
}
fields {
key: "premiumSubscriptionTransactionId"
value {
integer_value: 0
}
}
fields {
key: "speedAlerts"
value {
array_value {
}
}
}
}
update_mask {
field_paths: "countryId"
field_paths: "currency"
field_paths: "dataSourcesSettings.detectTripsAutomatically"
field_paths: "dataSourcesSettings.importAppleHealthWorkoutsAutomatically"
field_paths: "dataSourcesSettings.importGarminRidesAutomatically"
field_paths: "dataSourcesSettings.importGoogleHealthWorkoutsAutomatically"
field_paths: "dataSourcesSettings.importStravaRidesAutomatically"
field_paths: "dataSourcesSettings.uploadRidesToStravaAutomatically"
field_paths: "distanceUnit"
field_paths: "employmentStatus"
field_paths: "expenseReportConfiguration.accountableEmailAddress"
field_paths: "expenseReportConfiguration.daysOfWeek"
field_paths: "expenseReportConfiguration.endHour"
field_paths: "expenseReportConfiguration.maximalYearlyExpenseAmount"
field_paths: "expenseReportConfiguration.reportFrequency"
field_paths: "expenseReportConfiguration.sendToAccountable"
field_paths: "expenseReportConfiguration.sendToWinbooks"
field_paths: "expenseReportConfiguration.startHour"
field_paths: "expenseReportConfiguration.timeZone"
field_paths: "expenseReportConfiguration.unitPrice"
field_paths: "expenseReportConfiguration.uploadToCloud"
field_paths: "expenseReportConfiguration.winbooksEmailAddress"
field_paths: "fcmToken"
field_paths: "hasValidPremiumSubscription"
field_paths: "language"
field_paths: "premiumSubscriptionTransactionId"
field_paths: "speedAlerts"
}
}
stream_token: "\031\020hB\002\201\364\265\265"
}
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) write request: <WriteRequest 0x16c276568>: {
writes {
update {
name: "projects/sweel-test/databases/(default)/documents/users/sebtG8kxEnN7PiBFtykQKtUEdCt2"
fields {
key: "countryId"
value {
string_value: "BE"
}
}
fields {
key: "currency"
value {
string_value: "EUR"
}
}
fields {
key: "dataSourcesSettings"
value {
map_value {
fields {
key: "detectTripsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importAppleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGarminRidesAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGoogleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importStravaRidesAutomatically"
value {
boolean_value: true
}
}
fields {
key: "uploadRidesToStravaAutomatically"
value {
boolean_value: false
}
}
}
}
}
fields {
key: "distanceUnit"
value {
string_value: "kilometers"
}
}
fields {
key: "employmentStatus"
value {
string_value: "employee"
}
}
fields {
key: "expenseReportConfiguration"
value {
map_value {
fields {
key: "accountableEmailAddress"
value {
null_value: NULL_VALUE
}
}
fields {
key: "daysOfWeek"
value {
array_value {
values {
integer_value: 0
}
values {
integer_value: 1
}
values {
integer_value: 2
}
values {
integer_value: 3
}
values {
integer_value: 4
}
}
}
}
fields {
key: "endHour"
value {
string_value: "19:00"
}
}
fields {
key: "maximalYearlyExpenseAmount"
value {
double_value: 3500
}
}
fields {
key: "reportFrequency"
value {
string_value: "monthly"
}
}
fields {
key: "sendToAccountable"
value {
boolean_value: false
}
}
fields {
key: "sendToWinbooks"
value {
boolean_value: false
}
}
fields {
key: "startHour"
value {
string_value: "07:00"
}
}
fields {
key: "timeZone"
value {
string_value: "Europe/Brussels"
}
}
fields {
key: "unitPrice"
value {
double_value: 0.35
}
}
fields {
key: "uploadToCloud"
value {
boolean_value: false
}
}
fields {
key: "winbooksEmailAddress"
value {
null_value: NULL_VALUE
}
}
}
}
}
fields {
key: "fcmToken"
value {
string_value: "fO4ThKxYQELro8MTMXjRuM:APA91bFAubuxhIv-a_yJPNzm62xGWXietj4JmLpVSJAK1bjx8Pc8c82QF7T_ZKd1eDiVvIGWAV6qSBodT5qNnQqqoNjxoPcP5Toek9YIwVHF8SHIvW91MCg"
}
}
fields {
key: "hasValidPremiumSubscription"
value {
boolean_value: false
}
}
fields {
key: "language"
value {
string_value: "en"
}
}
fields {
key: "premiumSubscriptionTransactionId"
value {
integer_value: 0
}
}
fields {
key: "speedAlerts"
value {
array_value {
}
}
}
}
...
key: "sendToAccountable"
value {
boolean_value: false
}
}
fields {
key: "sendToWinbooks"
value {
boolean_value: false
}
}
fields {
key: "startHour"
value {
string_value: "07:00"
}
}
fields {
key: "timeZone"
value {
string_value: "Europe/Brussels"
}
}
fields {
key: "unitPrice"
value {
double_value: 0.35
}
}
fields {
key: "uploadToCloud"
value {
boolean_value: false
}
}
fields {
key: "winbooksEmailAddress"
value {
null_value: NULL_VALUE
}
}
}
}
}
fields {
key: "fcmToken"
value {
string_value: "fO4ThKxYQELro8MTMXjRuM:APA91bFAubuxhIv-a_yJPNzm62xGWXietj4JmLpVSJAK1bjx8Pc8c82QF7T_ZKd1eDiVvIGWAV6qSBodT5qNnQqqoNjxoPcP5Toek9YIwVHF8SHIvW91MCg"
}
}
fields {
key: "hasValidPremiumSubscription"
value {
boolean_value: false
}
}
fields {
key: "language"
value {
string_value: "en"
}
}
fields {
key: "premiumSubscriptionTransactionId"
value {
integer_value: 0
}
}
fields {
key: "speedAlerts"
value {
array_value {
}
}
}
}
update_mask {
field_paths: "countryId"
field_paths: "currency"
field_paths: "dataSourcesSettings.detectTripsAutomatically"
field_paths: "dataSourcesSettings.importAppleHealthWorkoutsAutomatically"
field_paths: "dataSourcesSettings.importGarminRidesAutomatically"
field_paths: "dataSourcesSettings.importGoogleHealthWorkoutsAutomatically"
field_paths: "dataSourcesSettings.importStravaRidesAutomatically"
field_paths: "dataSourcesSettings.uploadRidesToStravaAutomatically"
field_paths: "distanceUnit"
field_paths: "employmentStatus"
field_paths: "expenseReportConfiguration.accountableEmailAddress"
field_paths: "expenseReportConfiguration.daysOfWeek"
field_paths: "expenseReportConfiguration.endHour"
field_paths: "expenseReportConfiguration.maximalYearlyExpenseAmount"
field_paths: "expenseReportConfiguration.reportFrequency"
field_paths: "expenseReportConfiguration.sendToAccountable"
field_paths: "expenseReportConfiguration.sendToWinbooks"
field_paths: "expenseReportConfiguration.startHour"
field_paths: "expenseReportConfiguration.timeZone"
field_paths: "expenseReportConfiguration.unitPrice"
field_paths: "expenseReportConfiguration.uploadToCloud"
field_paths: "expenseReportConfiguration.winbooksEmailAddress"
field_paths: "fcmToken"
field_paths: "hasValidPremiumSubscription"
field_paths: "language"
field_paths: "premiumSubscriptionTransactionId"
field_paths: "speedAlerts"
}
}
stream_token: "\020l\031\020hB\002\201\364\265\265"
}
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) response: <ListenResponse 0x16c532640>: {
target_change {
resume_token: "\n\t\010\326\320\254\363\353\317\213\003"
read_time {
seconds: 1739971755
nanos: 714646000
}
}
}
11.8.1 - [FirebaseFirestore][I-FST000001] LocalStore Ignoring outdated update for users/sebtG8kxEnN7PiBFtykQKtUEdCt2. Current version: Timestamp(seconds=1739971899, nanoseconds=738729000) Remote version: Timestamp(seconds=1739971755, nanoseconds=714646000)
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Apply remote event: 2 changes (154 bytes):
- Put [target: target_id=76] (133 bytes)
- Put [target_global:] (21 bytes)>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NotifyLocalViewChanges: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) response: <WriteResponse 0x16c532668>: {
stream_token: "\020m\031\020hB\002\201\364\265\265"
write_results {
update_time {
seconds: 1739971901
nanos: 698775000
}
}
commit_time {
seconds: 1739971901
nanos: 698775000
}
}
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction Acknowledge batch: 10 changes (3506 bytes):
- Delete [document_mutation: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2 batch_id=469]
- Delete [mutation: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 batch_id=469]
- Put [document_overlays: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2 batch_id=17101] (2109 bytes)
- Put [document_overlays_collection_group_index: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 collection_group=users batch_id=17101 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)
- Put [document_overlays_collection_index: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 path=users batch_id=17101 document_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)
- Put [document_overlays_largest_batch_id_index: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2 batch_id=17101 path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)
- Put [document_target: path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2 target_id=0] (2 bytes)
- Put [mutation_queue: user_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (13 bytes)
- Put [remote_document: path=users/sebtG8kxEnN7PiBFtykQKtUEdCt2] (1382 bytes)
- Put [remote_document_read_time: path=users snapshot_version=Timestamp(seconds=1739971901, nanoseconds=698775000) document_id=sebtG8kxEnN7PiBFtykQKtUEdCt2] (0 bytes)>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NotifyLocalViewChanges: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] Committing transaction: <LevelDbTransaction NextMutationBatchAfterBatchID: 0 changes (0 bytes):>
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) write request: <WriteRequest 0x16c5322b8>: {
writes {
update {
name: "projects/sweel-test/databases/(default)/documents/users/sebtG8kxEnN7PiBFtykQKtUEdCt2"
fields {
key: "countryId"
value {
string_value: "BE"
}
}
fields {
key: "currency"
value {
string_value: "EUR"
}
}
fields {
key: "dataSourcesSettings"
value {
map_value {
fields {
key: "detectTripsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importAppleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGarminRidesAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGoogleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importStravaRidesAutomatically"
value {
boolean_value: false
}
}
fields {
key: "uploadRidesToStravaAutomatically"
value {
boolean_value: false
}
}
}
}
}
fields {
key: "distanceUnit"
value {
string_value: "kilometers"
}
}
fields {
key: "employmentStatus"
value {
string_value: "employee"
}
}
fields {
key: "expenseReportConfiguration"
value {
map_value {
fields {
key: "accountableEmailAddress"
value {
null_value: NULL_VALUE
}
}
fields {
key: "daysOfWeek"
value {
array_value {
values {
integer_value: 0
}
values {
integer_value: 1
}
values {
integer_value: 2
}
values {
integer_value: 3
}
values {
integer_value: 4
}
}
}
}
fields {
key: "endHour"
value {
string_value: "19:00"
}
}
fields {
key: "maximalYearlyExpenseAmount"
value {
double_value: 3500
}
}
fields {
key: "reportFrequency"
value {
string_value: "monthly"
}
}
fields {
key: "sendToAccountable"
value {
boolean_value: false
}
}
fields {
key: "sendToWinbooks"
value {
boolean_value: false
}
}
fields {
key: "startHour"
value {
string_value: "07:00"
}
}
fields {
key: "timeZone"
value {
string_value: "Europe/Brussels"
}
}
fields {
key: "unitPrice"
value {
double_value: 0.35
}
}
fields {
key: "uploadToCloud"
value {
boolean_value: false
}
}
fields {
key: "winbooksEmailAddress"
value {
null_value: NULL_VALUE
}
}
}
}
}
fields {
key: "fcmToken"
value {
string_value: "fO4ThKxYQELro8MTMXjRuM:APA91bFAubuxhIv-a_yJPNzm62xGWXietj4JmLpVSJAK1bjx8Pc8c82QF7T_ZKd1eDiVvIGWAV6qSBodT5qNnQqqoNjxoPcP5Toek9YIwVHF8SHIvW91MCg"
}
}
fields {
key: "hasValidPremiumSubscription"
value {
boolean_value: false
}
}
fields {
key: "language"
value {
string_value: "en"
}
}
fields {
key: "premiumSubscriptionTransactionId"
value {
integer_value: 0
}
}
fields {
key: "speedAlerts"
value {
array_value {
}
}
}
}
update_mask {
field_paths: "countryId"
field_paths: "currency"
field_paths: "dataSourcesSettings.detectTripsAutomatically"
field_paths: "dataSourcesSettings.importAppleHealthWorkoutsAutomatically"
field_paths: "dataSourcesSettings.importGarminRidesAutomatically"
field_paths: "dataSourcesSettings.importGoogleHealthWorkoutsAutomatically"
field_paths: "dataSourcesSettings.importStravaRidesAutomatically"
field_paths: "dataSourcesSettings.uploadRidesToStravaAutomatically"
field_paths: "distanceUnit"
field_paths: "employmentStatus"
field_paths: "expenseReportConfiguration.accountableEmailAddress"
field_paths: "expenseReportConfiguration.daysOfWeek"
field_paths: "expenseReportConfiguration.endHour"
field_paths: "expenseReportConfiguration.maximalYearlyExpenseAmount"
field_paths: "expenseReportConfiguration.reportFrequency"
field_paths: "expenseReportConfiguration.sendToAccountable"
field_paths: "expenseReportConfiguration.sendToWinbooks"
field_paths: "expenseReportConfiguration.startHour"
field_paths: "expenseReportConfiguration.timeZone"
field_paths: "expenseReportConfiguration.unitPrice"
field_paths: "expenseReportConfiguration.uploadToCloud"
field_paths: "expenseReportConfiguration.winbooksEmailAddress"
field_paths: "fcmToken"
field_paths: "hasValidPremiumSubscription"
field_paths: "language"
field_paths: "premiumSubscriptionTransactionId"
field_paths: "speedAlerts"
}
}
stream_token: "\020m\031\020hB\002\201\364\265\265"
}
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WatchStream (313130313637633138) response: <ListenResponse 0x16c532640>: {
document_change {
document {
name: "projects/sweel-test/databases/(default)/documents/users/sebtG8kxEnN7PiBFtykQKtUEdCt2"
fields {
key: "speedAlerts"
value {
array_value {
}
}
}
fields {
key: "hasValidPremiumSubscription"
value {
boolean_value: false
}
}
fields {
key: "fcmToken"
value {
string_value: "fO4ThKxYQELro8MTMXjRuM:APA91bFAubuxhIv-a_yJPNzm62xGWXietj4JmLpVSJAK1bjx8Pc8c82QF7T_ZKd1eDiVvIGWAV6qSBodT5qNnQqqoNjxoPcP5Toek9YIwVHF8SHIvW91MCg"
}
}
fields {
key: "countryId"
value {
string_value: "BE"
}
}
fields {
key: "employmentStatus"
value {
string_value: "employee"
}
}
fields {
key: "dataSourcesSettings"
value {
map_value {
fields {
key: "detectTripsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "uploadRidesToStravaAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGoogleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importGarminRidesAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importAppleHealthWorkoutsAutomatically"
value {
boolean_value: false
}
}
fields {
key: "importStravaRidesAutomatically"
value {
boolean_value: false
}
}
}
}
}
fields {
key: "summary"
value {
map_value {
fields {
key: "tripsCount"
value {
integer_value: 0
}
}
fields {
key: "professionalTripsDistance"
value {
double_value: 0
}
}
fields {
key: "allTimeProfessionalTripsDistance"
value {
double_value: 0
}
}
fields {
key: "tripsDuration"
value {
double_value: 0
}
}
fields {
key: "professionalTripsExpensePrice"
value {
double_value: 0
}
}
fields {
key: "tripsDistance"
value {
double_value: 0
}
}
fields {
key: "professionalTripsCount"
value {
integer_value: 0
}
}
}
}
}
fields {
key: "distanceUnit"
value {
string_value: "kilometers"
}
}
fields {
key: "expenseReportConfiguration"
value {
map_value {
fields {
key: "unitPrice"
value {
double_value: 0.35
}
}
fields {
key: "timeZone"
value {
string_value: "Europe/Brussels"
}
}
fields {
key: "startHour"
value {
string_value: "07:00"
}
}
fields {
key: "endHour"
value {
string_value: "19:00"
}
}
fields {
key: "sendToAccountable"
value {
boolean_value: false
}
}
fields {
key: "maximalYearlyExpenseAmount"
value {
double_value: 3500
}
}
fields {
key: "sendToWinbooks"
value {
boolean_value: false
}
}
fields {
key: "accountableEmailAddress"
value {
null_value: NULL_VALUE
}
}
fields {
key: "reportFrequency"
value {
string_value: "monthly"
}
}
fields {
key: "daysOfWeek"
value {
array_value {
values {
integer_value: 0
}
values {
integer_value: 1
}
values {
integer_value: 2
}
values {
integer_value: 3
}
values {
integer_value: 4
}
}
}
}
fields {
key: "uploadToCloud"
value {
boolean_value: false
}
}
fields {
key: "winbooksEmailAddress"
value {
null_value: NULL_VALUE
}
}
}
}
}
fields {
key: "currency"
value {
string_value: "EUR"
}
}
fields {
key: "language"
value {
string_value: "en"
}
}
fields {
key: "premiumSubscriptionTransactionId"
value {
integer_value: 0
}
}
create_time {
seconds: 1739967331
nanos: 438617000
}
update_time {
seconds: 1739971757
nanos: 473100000
}
}
target_ids: 76
}
}
...
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) headers (allowlisted): date: Wed, 19 Feb 2025 13:28:19 GMT
11.8.1 - [FirebaseFirestore][I-FST000001] WriteStream (313130313438613138) response: <WriteResponse 0x16c532668>: {
stream_token: "\020|\031\020hB\002\201\364\265\265"
write_results {
update_time {
seconds: 1739971931
nanos: 358674000
}
}
commit_time {
seconds: 1739971931
nanos: 358674000
}
}
Expand Package.resolved snippet
{
"originHash" : "b3f189916561e6dfffabe18014e07527e8bd7ad9e5d18495e929a4dc5ce1dd0b",
"pins" : [
{
"identity" : "abseil-cpp-binary",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/abseil-cpp-binary.git",
"state" : {
"revision" : "194a6706acbd25e4ef639bcaddea16e8758a3e27",
"version" : "1.2024011602.0"
}
},
{
"identity" : "app-check",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/app-check.git",
"state" : {
"revision" : "61b85103a1aeed8218f17c794687781505fbbef5",
"version" : "11.2.0"
}
},
{
"identity" : "appauth-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/openid/AppAuth-iOS.git",
"state" : {
"revision" : "71cde449f13d453227e687458144bde372d30fc7",
"version" : "1.6.2"
}
},
{
"identity" : "bettercodable",
"kind" : "remoteSourceControl",
"location" : "https://github.com/marksands/BetterCodable",
"state" : {
"revision" : "61153170668db7a46a20a87e35e70f80b24d4eb5",
"version" : "0.4.0"
}
},
{
"identity" : "brightfutures",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Thomvis/BrightFutures.git",
"state" : {
"revision" : "fa66fa183dce7196d431244d0215748cd14c5758",
"version" : "8.2.0"
}
},
{
"identity" : "devicekit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/devicekit/DeviceKit.git",
"state" : {
"revision" : "fe41d18eccd92a115cffaa35dfff03018c67e635",
"version" : "5.2.2"
}
},
{
"identity" : "erik",
"kind" : "remoteSourceControl",
"location" : "https://github.com/phimage/Erik.git",
"state" : {
"revision" : "109a130e9cdb00789a43a7a625293eeb12d22989",
"version" : "5.1.0"
}
},
{
"identity" : "filekit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/nvzqz/FileKit.git",
"state" : {
"revision" : "9006d2888025fbe893c3c396327b2fe45a8c177b",
"version" : "6.1.0"
}
},
{
"identity" : "firebase-ios-sdk",
"kind" : "remoteSourceControl",
"location" : "https://github.com/firebase/firebase-ios-sdk.git",
"state" : {
"revision" : "6318278e8e64d21f0fdcc69004395e4d34048aaf",
"version" : "11.8.1"
}
},
{
"identity" : "googleappmeasurement",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleAppMeasurement.git",
"state" : {
"revision" : "be0881ff728eca210ccb628092af400c086abda3",
"version" : "11.7.0"
}
},
{
"identity" : "googledatatransport",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleDataTransport.git",
"state" : {
"revision" : "617af071af9aa1d6a091d59a202910ac482128f9",
"version" : "10.1.0"
}
},
{
"identity" : "googlesignin-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleSignIn-iOS",
"state" : {
"revision" : "7932d33686c1dc4d7df7a919aae47361d1cdfda4",
"version" : "7.0.0"
}
},
{
"identity" : "googleutilities",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleUtilities.git",
"state" : {
"revision" : "53156c7ec267db846e6b64c9f4c4e31ba4cf75eb",
"version" : "8.0.2"
}
},
{
"identity" : "grpc-binary",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/grpc-binary.git",
"state" : {
"revision" : "f56d8fc3162de9a498377c7b6cea43431f4f5083",
"version" : "1.65.1"
}
},
{
"identity" : "gtm-session-fetcher",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/gtm-session-fetcher.git",
"state" : {
"revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b",
"version" : "3.5.0"
}
},
{
"identity" : "gtmappauth",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GTMAppAuth.git",
"state" : {
"revision" : "cee3c709307912d040bd1e06ca919875a92339c6",
"version" : "2.0.0"
}
},
{
"identity" : "interop-ios-for-google-sdks",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/interop-ios-for-google-sdks.git",
"state" : {
"revision" : "2d12673670417654f08f5f90fdd62926dc3a2648",
"version" : "100.0.0"
}
},
{
"identity" : "kanna",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tid-kijyun/Kanna.git",
"state" : {
"revision" : "41c3d28ea0eac07e4551b28def9de1ede702e739",
"version" : "5.3.0"
}
},
{
"identity" : "kingfisher",
"kind" : "remoteSourceControl",
"location" : "https://github.com/onevcat/Kingfisher.git",
"state" : {
"revision" : "af4be924ad984cf4d16f4ae4df424e79a443d435",
"version" : "7.6.2"
}
},
{
"identity" : "leveldb",
"kind" : "remoteSourceControl",
"location" : "https://github.com/firebase/leveldb.git",
"state" : {
"revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
"version" : "1.22.2"
}
},
{
"identity" : "mapbox-common-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-common-ios.git",
"state" : {
"revision" : "462930ede08570c1636601c5d5bdad35c6d96330",
"version" : "23.11.0"
}
},
{
"identity" : "mapbox-core-maps-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-core-maps-ios.git",
"state" : {
"revision" : "a46690fa9a8def6a5b77f380082bccdf63170a02",
"version" : "10.19.1"
}
},
{
"identity" : "mapbox-directions-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-directions-swift.git",
"state" : {
"revision" : "6512320ee7f0091a4c55abe2bc6414f078da88c8",
"version" : "2.14.0"
}
},
{
"identity" : "mapbox-maps-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-maps-ios.git",
"state" : {
"revision" : "43857045685cc53c69c6b529682579205de91581",
"version" : "10.19.0"
}
},
{
"identity" : "mapbox-navigation-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-navigation-ios.git",
"state" : {
"revision" : "d5c6d47fc5beea3627d61626899473793d51eec4",
"version" : "2.19.0-beta.1"
}
},
{
"identity" : "mapbox-navigation-native-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-navigation-native-ios.git",
"state" : {
"revision" : "3219948f4353de1f429093178295cf363ffff989",
"version" : "206.1.0"
}
},
{
"identity" : "mapbox-speech-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/mapbox-speech-swift.git",
"state" : {
"revision" : "a9ef284deae227c6111c27a3535098c1e9a9d8e3",
"version" : "2.1.1"
}
},
{
"identity" : "nanopb",
"kind" : "remoteSourceControl",
"location" : "https://github.com/firebase/nanopb.git",
"state" : {
"revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
"version" : "2.30910.0"
}
},
{
"identity" : "oauthswift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/OAuthSwift/OAuthSwift.git",
"state" : {
"revision" : "d85964b96dbce94df961f28b996187c835089903",
"version" : "2.2.0"
}
},
{
"identity" : "polyline",
"kind" : "remoteSourceControl",
"location" : "https://github.com/raphaelmor/Polyline.git",
"state" : {
"revision" : "353f80378dcd8f17eefe8550090c6b1ae3c9da23",
"version" : "5.1.0"
}
},
{
"identity" : "promises",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/promises.git",
"state" : {
"revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
"version" : "2.4.0"
}
},
{
"identity" : "solar",
"kind" : "remoteSourceControl",
"location" : "https://github.com/ceeK/Solar.git",
"state" : {
"revision" : "c2b96f2d5fb7f835b91cefac5e83101f54643901",
"version" : "3.0.1"
}
},
{
"identity" : "surge",
"kind" : "remoteSourceControl",
"location" : "https://github.com/jounce/Surge",
"state" : {
"revision" : "6e4a47e63da8801afe6188cf039e9f04eb577721",
"version" : "2.3.2"
}
},
{
"identity" : "swift-argument-parser",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-argument-parser",
"state" : {
"revision" : "df9ee6676cd5b3bf5b330ec7568a5644f547201b",
"version" : "1.1.3"
}
},
{
"identity" : "swift-protobuf",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-protobuf.git",
"state" : {
"revision" : "e1499bc69b9040b29184f7f2996f7bab467c1639",
"version" : "1.19.0"
}
},
{
"identity" : "swifter",
"kind" : "remoteSourceControl",
"location" : "https://github.com/httpswift/swifter.git",
"state" : {
"revision" : "9483a5d459b45c3ffd059f7b55f9638e268632fd",
"version" : "1.5.0"
}
},
{
"identity" : "swiftui-introspect",
"kind" : "remoteSourceControl",
"location" : "https://github.com/siteline/SwiftUI-Introspect.git",
"state" : {
"revision" : "f2616860a41f9d9932da412a8978fec79c06fe24",
"version" : "0.1.4"
}
},
{
"identity" : "tcxdataprotocol",
"kind" : "remoteSourceControl",
"location" : "https://github.com/FitnessKit/TcxDataProtocol",
"state" : {
"revision" : "d879fb3022d971ea39676a9fc63ede4af437c6f3",
"version" : "1.0.2"
}
},
{
"identity" : "turf-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mapbox/turf-swift.git",
"state" : {
"revision" : "213050191cfcb3d5aa76e1fa90c6ff1e182a42ca",
"version" : "2.8.0"
}
},
{
"identity" : "xmlcoder",
"kind" : "remoteSourceControl",
"location" : "https://github.com/MaxDesiatov/XMLCoder",
"state" : {
"revision" : "b1e944cbd0ef33787b13f639a5418d55b3bed501",
"version" : "0.17.1"
}
}
],
"version" : 3
}
If using CocoaPods, the project's Podfile.lock
Expand Podfile.lock snippet
Replace this line with the contents of your Podfile.lock!
I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.
Thanks for reporting @ir-fuel .
You mentioned In the (infinite) logs the batch_id numbers are always the same. However, in the log above I only see the batch_id once (469 and 17101). In other words I see Committing transaction: <LevelDbTransaction Acknowledge batch only once. I understand you have cut down the log to make it smaller. Do you see LevelDbTransaction Acknowledge batch repeatedly? I'm curious which writes are occurring in an infinite loop?
my app isn't updating that Firestore entry. It's continuously processing updates of that object it seems, but the closure is never called with an updated document. I checked the server and there are no Firebase functions running constantly, and none of them are stuck in a loop as they would time out after 1 minute.
It's probably the client trying to reconcile its cache (and offline changes to a document) with the state of the server. So it doesn't mean the document on the Firestore server is changing. It means the local cache is changing.
I'm also curious whether your device (simulator?) is in a bad state? Meaning, do you see the issue on a fresh simulator for example?
The biggest issue is it doesn't happen all the time. Yesterday the entire day it happened, and today it stopped happening. I still have a huge log file from yesterday (205MB) if that can help:
https://www.dropbox.com/scl/fi/e173s2tv9t39q2voqebp1/logs.txt?rlkey=0uvnv2zn3bkmd90x5uoqbz8he&st=aecyyo07&dl=0
This is all happening when running on my own real device.
Thanks for sharing @ir-fuel . I've looked at your log. The log seems reasonable. There is no infinite loop. Your client is receiving acknowledgements from the Firestore server about document updates, and the batch_id is not the same in different iterations.
Two scenarios that I can think of are:
-
your usage pattern: For example if you keep your app offline for a long period of time (or
disableNetwork), a large number of document mutations could add up, and once your device is allowed to sync with the server it will have to perform a lot of updates. -
a bug in your code: For example: if you're listening to a document and updating the same document upon receiving an update for it, leading to an infinite loop of updates
Simply calling db.collection("users").document(uid).addSnapshotListener { ... does not reproduce the issue. To be able to investigate further, we'd need a reproduction repo.
The thing is that I have no idea what's happening. The phone is constantly connected to internet.
It can't be the server, since I can see in my Firebase Functions logs that nothing is being called / triggered, and I placed breakpoints in my app code at every line of code where that object is being saved, and the app never passes there. (Also no other clients have access to this object, nor are they running, since this is a development app that's not being used on other devices).
As I said, right now it's not happening anymore. I had it happen on a few days already, it's really a mystery.
Also your latest example: updating the document when receiving it in the callback doesn't happen, since the listener is just stuck in a loop in its own thread and never returns an updated object. I suppose that even if I were to do a lot of updates server-side (which isn't the case) the closure should be called at some point? It just never is.
Thanks for clarifying. That's very strange. I'll close this. Feel free to reopen if it reoccurs or you're able to reproduce it.