firebase / flutterfire

πŸ”₯ A collection of Firebase plugins for Flutter apps.
https://firebase.google.com/docs/flutter/setup
BSD 3-Clause "New" or "Revised" License
8.61k stars 3.95k forks source link

πŸ› [firebase_database] OnDisconnect not called upon internet connection lost #7757

Closed Tom3652 closed 2 years ago

Tom3652 commented 2 years ago

Bug report

Describe the bug

I am not sure that this is a bug, but the OnDisconnect is never called in my case when :

I am building an online presence system and this feature is highly required in my case.

Expected behavior

I have followed this documentation and setup a onDisconnect() method on a specific ref.

I expect that when loosing connection to the database (by crashes, no internet, etc..), the FirebaseDatabase.instance.ref("any/ref").onDisconnect().set(updates) is triggered.

Also, if I may ask, how I am suppose to "listen" the "regain" of connectivity to do the opposite query of OnDisconnect ? Is there a onConnect() ?

Additional context

Maybe i simply don't understand how to use the OnDisconnect or didn't understand well the documentation ( i don't understand why there is a await actually.

But in my initState() method of a specific widget that is alive, i simply call the above method (FirebaseDatabase.instance.ref("any/ref").onDisconnect().set(updates)) once and assume that it will be called at the right moment.


Flutter doctor

Run flutter doctor and paste the output below:

Click To Expand ``` Doctor summary (to see all details, run flutter doctor -v): [βœ“] Flutter (Channel stable, 2.8.1, on macOS 12.1 21C52 darwin-x64, locale fr-FR) [βœ“] Android toolchain - develop for Android devices (Android SDK version 31.0.0) [βœ“] Xcode - develop for iOS and macOS (Xcode 13.2.1) [βœ“] Chrome - develop for the web [βœ“] Android Studio (version 2020.3) [βœ“] VS Code (version 1.63.2) [βœ“] Connected device (3 available) β€’ No issues found! ```

Flutter dependencies

Run flutter pub deps -- --style=compact and paste the output below:

Click To Expand ``` Dart SDK 2.15.1 Flutter SDK 2.8.1 myappname 1.0.0+1 dependencies: - app_settings 4.1.1 [flutter] - app_tracking_transparency 2.0.2+1 [flutter] - apple_maps_flutter 1.0.1 [flutter] - auto_size_text 3.0.0 [flutter] - badges 2.0.2 [flutter] - cached_network_image 3.2.0 [flutter flutter_cache_manager octo_image cached_network_image_platform_interface cached_network_image_web] - camera 0.9.4+5 [camera_platform_interface camera_web flutter pedantic quiver flutter_plugin_android_lifecycle] - clipboard 0.1.3 [flutter] - cloud_functions 3.2.4 [cloud_functions_platform_interface cloud_functions_web firebase_core firebase_core_platform_interface flutter] - connectivity_plus 2.1.0 [flutter connectivity_plus_platform_interface connectivity_plus_linux connectivity_plus_macos connectivity_plus_web connectivity_plus_windows] - country_code_picker 2.0.2 [flutter modal_bottom_sheet collection universal_platform] - crypto 3.0.1 [collection typed_data] - cupertino_back_gesture 0.1.0 [flutter] - cupertino_icons 1.0.4 - disk_space 0.2.1 [flutter] - emoji_picker_flutter 1.0.8 [flutter shared_preferences] - extended_image 6.0.1 [extended_image_library flutter meta] - extended_tabs 2.3.0 [flutter] - firebase_analytics 9.0.4 [firebase_analytics_platform_interface firebase_analytics_web firebase_core firebase_core_platform_interface flutter] - firebase_auth 3.3.4 [firebase_auth_platform_interface firebase_auth_web firebase_core firebase_core_platform_interface flutter meta] - firebase_core 1.10.6 [firebase_core_platform_interface firebase_core_web flutter meta] - firebase_crashlytics 2.4.4 [firebase_core firebase_core_platform_interface firebase_crashlytics_platform_interface flutter stack_trace] - firebase_database 9.0.4 [firebase_core firebase_core_platform_interface firebase_database_platform_interface firebase_database_web flutter] - firebase_dynamic_links 4.0.3 [firebase_core firebase_core_platform_interface firebase_dynamic_links_platform_interface flutter meta plugin_platform_interface] - firebase_messaging 11.2.4 [firebase_core firebase_core_platform_interface firebase_messaging_platform_interface firebase_messaging_web flutter meta] - firebase_performance 0.8.0+3 [firebase_core firebase_core_platform_interface firebase_performance_platform_interface firebase_performance_web flutter] - firebase_storage 10.2.4 [firebase_core firebase_core_platform_interface firebase_storage_platform_interface firebase_storage_web flutter] - flutter 0.0.0 [characters collection meta typed_data vector_math sky_engine] - flutter_app_badger 1.3.0 [flutter] - flutter_arc_text 0.5.0 [characters flutter] - flutter_contacts 1.1.2 [flutter] - flutter_facebook_auth 3.5.7 [flutter flutter_facebook_auth_platform_interface flutter_facebook_auth_web] - flutter_ffmpeg 0.4.2 [flutter] - flutter_image_compress 1.1.0 [flutter] - flutter_interactive_keyboard 0.2.0 [flutter] - flutter_localizations 0.0.0 [flutter intl characters clock collection meta path typed_data vector_math] - flutter_native_text_input 1.2.4 [flutter] - flutter_sound_lite 8.4.2 [path_provider recase uuid provider path synchronized logger flutter flutter_sound_platform_interface flutter_sound_web] - flutter_staggered_grid_view 0.6.0 [flutter] - flutter_svg 1.0.0 [flutter meta path_drawing vector_math xml] - geocoding 2.0.1 [flutter geocoding_platform_interface] - geolocator 8.0.1 [flutter geolocator_platform_interface geolocator_android geolocator_apple geolocator_web] - google_fonts 2.2.0 [flutter http path_provider crypto] - google_maps_flutter 2.1.1 [flutter flutter_plugin_android_lifecycle google_maps_flutter_platform_interface] - google_mobile_ads 1.0.1 [meta flutter] - google_sign_in 5.2.1 [flutter google_sign_in_platform_interface google_sign_in_web meta] - hive 2.0.5 [meta crypto] - hive_flutter 1.1.0 [flutter hive path_provider path] - http 0.13.4 [async http_parser meta path] - image_editor 1.0.2 [flutter] - in_app_purchase 2.0.1 [flutter in_app_purchase_platform_interface in_app_purchase_android in_app_purchase_storekit] - in_app_review 2.0.3 [flutter in_app_review_platform_interface] - intl 0.17.0 [clock path] - logger 1.1.0 - native_admob_flutter 1.5.0 [flutter] - package_info_plus 1.3.0 [flutter package_info_plus_platform_interface package_info_plus_linux package_info_plus_macos package_info_plus_windows package_info_plus_web] - path 1.8.0 - path_provider 2.0.8 [flutter path_provider_android path_provider_ios path_provider_linux path_provider_macos path_provider_platform_interface path_provider_windows] - percent_indicator 3.4.0 [flutter] - perfect_volume_control 1.0.5 [flutter] - permission_handler 8.3.0 [flutter meta permission_handler_platform_interface] - photo_manager 1.3.10 [flutter] - provider 6.0.2 [collection flutter nested] - pull_to_refresh 2.0.0 [flutter] - rive 0.8.1 [collection flutter graphs http meta] - screen_capture_event 1.0.0+1 [flutter permission_handler] - scrollable_positioned_list 0.2.3 [flutter collection] - share_plus 3.0.4 [meta mime flutter share_plus_platform_interface share_plus_linux share_plus_macos share_plus_windows share_plus_web] - shared_preferences 2.0.11 [flutter meta shared_preferences_android shared_preferences_ios shared_preferences_linux shared_preferences_macos shared_preferences_platform_interface shared_preferences_web shared_preferences_windows] - sign_in_with_apple 3.3.0 [flutter meta sign_in_with_apple_platform_interface sign_in_with_apple_web] - sliver_tools 0.2.5 [flutter] - sqflite 2.0.1 [flutter sqflite_common path] - translator 0.1.7 [http] - url_launcher 6.0.17 [flutter meta url_launcher_android url_launcher_ios url_launcher_linux url_launcher_macos url_launcher_platform_interface url_launcher_web url_launcher_windows] - uuid 3.0.5 [crypto] - video_compress 3.1.1 [flutter] - video_player 2.2.10 [flutter meta video_player_platform_interface video_player_web html] - video_thumbnail 0.4.3 [flutter] - visibility_detector 0.2.2 [flutter] dev dependencies: - build_runner 2.1.7 [args async analyzer build build_config build_daemon build_resolvers build_runner_core code_builder collection crypto dart_style frontend_server_client glob graphs http_multi_server io js logging meta mime package_config path pool pub_semver pubspec_parse shelf shelf_web_socket stack_trace stream_transform timing watcher web_socket_channel yaml] - flutter_lints 1.0.4 [lints] - flutter_test 0.0.0 [flutter test_api path fake_async clock stack_trace vector_math async boolean_selector characters charcode collection matcher meta source_span stream_channel string_scanner term_glyph typed_data] - hive_generator 1.1.1 [build source_gen hive analyzer source_helper] transitive dependencies: - _fe_analyzer_shared 31.0.0 [meta] - analyzer 2.8.0 [_fe_analyzer_shared cli_util collection convert crypto glob meta package_config path pub_semver source_span watcher yaml] - args 2.3.0 - async 2.8.2 [collection meta] - boolean_selector 2.1.0 [source_span string_scanner] - build 2.2.1 [analyzer async convert crypto glob logging meta path] - build_config 1.0.0 [checked_yaml json_annotation path pubspec_parse yaml] - build_daemon 3.0.1 [built_collection built_value http_multi_server logging path pool shelf shelf_web_socket stream_transform watcher web_socket_channel] - build_resolvers 2.0.6 [analyzer async build crypto graphs logging path package_config pool pub_semver stream_transform yaml] - build_runner_core 7.2.3 [async build build_config build_resolvers collection convert crypto glob graphs json_annotation logging meta path package_config pool timing watcher yaml] - built_collection 5.1.1 - built_value 8.1.3 [built_collection collection fixnum meta] - cached_network_image_platform_interface 1.0.0 [flutter flutter_cache_manager] - cached_network_image_web 1.0.1 [flutter flutter_cache_manager cached_network_image_platform_interface] - camera_platform_interface 2.1.1 [cross_file flutter meta plugin_platform_interface stream_transform] - camera_web 0.2.1+1 [camera_platform_interface flutter flutter_web_plugins stream_transform] - characters 1.2.0 - charcode 1.3.1 - checked_yaml 2.0.1 [json_annotation source_span yaml] - cli_util 0.3.5 [meta path] - clock 1.1.0 - cloud_functions_platform_interface 5.0.19 [firebase_core flutter meta plugin_platform_interface] - cloud_functions_web 4.2.5 [cloud_functions_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins js] - code_builder 4.1.0 [built_collection built_value collection matcher meta] - collection 1.15.0 - connectivity_plus_linux 1.1.1 [flutter connectivity_plus_platform_interface meta nm] - connectivity_plus_macos 1.2.1 [connectivity_plus_platform_interface flutter] - connectivity_plus_platform_interface 1.1.1 [flutter meta plugin_platform_interface] - connectivity_plus_web 1.1.0+1 [connectivity_plus_platform_interface flutter_web_plugins flutter] - connectivity_plus_windows 1.2.0 [connectivity_plus_platform_interface flutter] - convert 3.0.1 [typed_data] - cross_file 0.3.2 [flutter js meta] - csslib 0.17.1 [source_span] - dart_style 2.2.1 [analyzer args path pub_semver source_span] - dbus 0.6.6 [args ffi meta xml] - extended_image_library 3.1.0 [crypto flutter http_client_helper path path_provider] - fake_async 1.2.0 [clock collection] - ffi 1.1.2 - file 6.1.2 [meta path] - firebase 9.0.2 [http http_parser js] - firebase_analytics_platform_interface 3.0.3 [firebase_core flutter meta plugin_platform_interface] - firebase_analytics_web 0.4.0+4 [firebase_analytics_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins js] - firebase_auth_platform_interface 6.1.9 [firebase_core flutter meta plugin_platform_interface] - firebase_auth_web 3.3.5 [firebase_auth_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins http_parser intl js meta] - firebase_core_platform_interface 4.2.3 [collection flutter meta plugin_platform_interface] - firebase_core_web 1.5.3 [firebase_core_platform_interface flutter flutter_web_plugins js meta] - firebase_crashlytics_platform_interface 3.1.11 [collection firebase_core flutter meta plugin_platform_interface] - firebase_database_platform_interface 0.2.0+3 [collection firebase_core flutter meta plugin_platform_interface] - firebase_database_web 0.2.0+3 [firebase_core firebase_core_web firebase_database_platform_interface flutter flutter_web_plugins js] - firebase_dynamic_links_platform_interface 0.2.0+3 [firebase_core flutter meta plugin_platform_interface] - firebase_messaging_platform_interface 3.1.4 [firebase_core flutter meta plugin_platform_interface] - firebase_messaging_web 2.2.5 [firebase_core firebase_core_web firebase_messaging_platform_interface flutter flutter_web_plugins js meta] - firebase_performance_platform_interface 0.1.0+3 [firebase_core flutter plugin_platform_interface] - firebase_performance_web 0.1.0+3 [firebase firebase_core firebase_core_web firebase_performance_platform_interface flutter flutter_web_plugins js] - firebase_storage_platform_interface 4.0.11 [collection firebase_core flutter meta plugin_platform_interface] - firebase_storage_web 3.2.5 [async firebase_core firebase_core_web firebase_storage_platform_interface flutter flutter_web_plugins http js meta] - fixnum 1.0.0 - flutter_blurhash 0.6.0 [flutter meta pedantic] - flutter_cache_manager 3.3.0 [clock collection file flutter http path path_provider pedantic rxdart sqflite uuid] - flutter_facebook_auth_platform_interface 2.7.1 [flutter plugin_platform_interface] - flutter_facebook_auth_web 2.6.0+2 [flutter flutter_web_plugins js flutter_facebook_auth_platform_interface] - flutter_plugin_android_lifecycle 2.0.5 [flutter] - flutter_sound_platform_interface 8.4.2 [flutter meta plugin_platform_interface logger] - flutter_sound_web 8.4.2 [flutter_sound_platform_interface flutter logger flutter_web_plugins meta js] - flutter_web_plugins 0.0.0 [flutter js characters collection meta typed_data vector_math] - frontend_server_client 2.1.2 [async path] - geocoding_platform_interface 2.0.1 [flutter meta plugin_platform_interface] - geolocator_android 3.0.1 [flutter geolocator_platform_interface] - geolocator_apple 2.0.0+2 [flutter geolocator_platform_interface] - geolocator_platform_interface 3.0.1 [flutter plugin_platform_interface vector_math meta] - geolocator_web 2.1.1 [flutter flutter_web_plugins geolocator_platform_interface] - glob 2.0.2 [async collection file path string_scanner] - google_maps_flutter_platform_interface 2.1.3 [collection flutter meta plugin_platform_interface stream_transform] - google_sign_in_platform_interface 2.1.0 [flutter meta quiver] - google_sign_in_web 0.10.0+3 [flutter flutter_web_plugins google_sign_in_platform_interface js meta] - graphs 2.1.0 [collection] - html 0.15.0 [csslib source_span] - http_client_helper 2.0.2 [http] - http_multi_server 3.0.1 [async] - http_parser 4.0.0 [charcode collection source_span string_scanner typed_data] - in_app_purchase_android 0.2.2 [collection flutter in_app_purchase_platform_interface json_annotation meta] - in_app_purchase_platform_interface 1.3.0 [flutter plugin_platform_interface] - in_app_purchase_storekit 0.2.1 [collection flutter in_app_purchase_platform_interface json_annotation meta] - in_app_review_platform_interface 2.0.2 [flutter url_launcher plugin_platform_interface platform] - io 1.0.3 [meta path string_scanner] - js 0.6.3 - json_annotation 4.4.0 [meta] - lints 1.0.1 - logging 1.0.2 - matcher 0.12.11 [stack_trace] - meta 1.7.0 - mime 1.0.1 - modal_bottom_sheet 2.0.0 [flutter] - nested 1.0.0 [flutter] - nm 0.4.2 [dbus] - octo_image 1.0.1 [flutter flutter_blurhash] - package_config 2.0.2 [path] - package_info_plus_linux 1.0.3 [package_info_plus_platform_interface flutter path] - package_info_plus_macos 1.3.0 [flutter] - package_info_plus_platform_interface 1.0.2 [flutter meta plugin_platform_interface] - package_info_plus_web 1.0.4 [flutter flutter_web_plugins http meta package_info_plus_platform_interface] - package_info_plus_windows 1.0.4 [package_info_plus_platform_interface ffi flutter win32] - path_drawing 1.0.0 [vector_math meta path_parsing flutter] - path_parsing 1.0.0 [vector_math meta] - path_provider_android 2.0.11 [flutter path_provider_platform_interface] - path_provider_ios 2.0.7 [flutter path_provider_platform_interface] - path_provider_linux 2.1.4 [ffi flutter meta path path_provider_platform_interface xdg_directories] - path_provider_macos 2.0.4 [flutter meta path_provider_platform_interface] - path_provider_platform_interface 2.0.1 [flutter meta platform plugin_platform_interface] - path_provider_windows 2.0.4 [ffi flutter meta path path_provider_platform_interface win32] - pedantic 1.11.1 - permission_handler_platform_interface 3.7.0 [flutter meta plugin_platform_interface] - petitparser 4.4.0 [meta] - platform 3.1.0 - plugin_platform_interface 2.0.2 [meta] - pool 1.5.0 [async stack_trace] - process 4.2.4 [file path platform] - pub_semver 2.1.0 [collection meta] - pubspec_parse 1.2.0 [checked_yaml collection json_annotation pub_semver yaml] - quiver 3.0.1+1 [matcher] - recase 4.0.0 - rxdart 0.27.3 - share_plus_linux 2.0.4 [share_plus_platform_interface file flutter meta url_launcher] - share_plus_macos 2.0.2 [share_plus_platform_interface flutter] - share_plus_platform_interface 2.0.1 [flutter meta mime plugin_platform_interface] - share_plus_web 2.0.4 [share_plus_platform_interface url_launcher flutter flutter_web_plugins meta] - share_plus_windows 2.0.3 [share_plus_platform_interface flutter meta url_launcher] - shared_preferences_android 2.0.9 [flutter meta shared_preferences_platform_interface] - shared_preferences_ios 2.0.8 [flutter meta shared_preferences_platform_interface] - shared_preferences_linux 2.0.3 [file flutter meta path path_provider_linux shared_preferences_platform_interface] - shared_preferences_macos 2.0.2 [flutter shared_preferences_platform_interface] - shared_preferences_platform_interface 2.0.0 [flutter] - shared_preferences_web 2.0.2 [flutter flutter_web_plugins meta shared_preferences_platform_interface] - shared_preferences_windows 2.0.3 [file flutter meta path path_provider_platform_interface path_provider_windows shared_preferences_platform_interface] - shelf 1.2.0 [async collection http_parser path stack_trace stream_channel] - shelf_web_socket 1.0.1 [shelf stream_channel web_socket_channel] - sign_in_with_apple_platform_interface 1.0.0 [flutter plugin_platform_interface meta] - sign_in_with_apple_web 1.0.1 [flutter flutter_web_plugins sign_in_with_apple_platform_interface js] - sky_engine 0.0.99 - source_gen 1.2.1 [analyzer async build dart_style glob meta path source_span yaml] - source_helper 1.3.1 [analyzer collection source_gen] - source_span 1.8.1 [collection path term_glyph] - sqflite_common 2.1.0 [synchronized path meta] - stack_trace 1.10.0 [path] - stream_channel 2.1.0 [async] - stream_transform 2.0.0 - string_scanner 1.1.0 [charcode source_span] - synchronized 3.0.0 - term_glyph 1.2.0 - test_api 0.4.3 [async boolean_selector collection meta source_span stack_trace stream_channel string_scanner term_glyph matcher] - timing 1.0.0 [json_annotation] - typed_data 1.3.0 [collection] - universal_platform 1.0.0+1 - url_launcher_android 6.0.13 [flutter meta url_launcher_platform_interface] - url_launcher_ios 6.0.13 [flutter meta url_launcher_platform_interface] - url_launcher_linux 2.0.2 [flutter] - url_launcher_macos 2.0.2 [flutter] - url_launcher_platform_interface 2.0.4 [flutter plugin_platform_interface] - url_launcher_web 2.0.5 [flutter flutter_web_plugins meta url_launcher_platform_interface] - url_launcher_windows 2.0.2 [flutter] - vector_math 2.1.1 - video_player_platform_interface 5.0.0 [flutter plugin_platform_interface] - video_player_web 2.0.5 [flutter flutter_web_plugins meta pedantic video_player_platform_interface] - watcher 1.0.1 [async path] - web_socket_channel 2.1.0 [async crypto stream_channel] - win32 2.3.3 [ffi] - xdg_directories 0.2.0 [meta path process] - xml 5.3.1 [collection meta petitparser] - yaml 3.1.0 [collection source_span string_scanner] ```

darshankawar commented 2 years ago

@Tom3652 Although I haven't used onDisconnect() yet, but check this article and see if it helps to understand the method and it's usage a bit better.

Tom3652 commented 2 years ago

Thanks for the nice article especially on the Cloud Function part. However, this is a very similar logic that i have already implemented and the onDisconnect is never called in my case :/

I have tried using update() and set() to see if one of these methods would work but both were not triggered.

darshankawar commented 2 years ago

@Tom3652 Can you provide us a minimal code sample that we can directly use along with expected and actual behavior you are seeing ?

Tom3652 commented 2 years ago

Hi @darshankawar sorry i have not provided it before. Here is the code sample :

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  void _registerOnDisconnect() {
    FirebaseDatabase.instance.ref().child("test").onDisconnect().update({"online": false});
  }

  void _saveOnlineTrue() {
    FirebaseDatabase.instance.ref().child("test").update({"online": true});
  }

  @override
  void initState() {
    super.initState();
    _saveOnlineTrue();
    _registerOnDisconnect();
  }

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold()
    );
  }
}

What i have noticed :

Maybe there are more cases in which this method should be called, but these 2 are the most important and useful in my app.

Step to reproduce :

  1. Run the sample code
  2. Make sure your phone is only WIFI-connected (not 4G)
  3. Turn off WIFI
  4. See that the online: true remains true in the Firebase Console.

Correct me if i am wrong, but it should call the onDisconnect upon losing internet connection (thus to the Database) right ?

darshankawar commented 2 years ago

it should call the onDisconnect upon losing internet connection (thus to the Database) right ?

Ideally yes, I mean if you lose internet connection, onDisconnect() should be called. I am not sure if there if the method takes a bit time to comeback or get triggered since it need to communicate with the server side and hence you may be seeing online: true still.

Keeping it open for further insvestigation.

russellwheatley commented 2 years ago

Hey @Tom3652, if you wait a couple of minutes it does actually make the update. Not much we can do about the delay, it's up to the Firebase server to make the change once the connection is lost. Might be worth contacting Firebase support to make them aware of the delay.

Tom3652 commented 2 years ago

Hi @russellwheatley, thanks for the explanation ! I have made a ticket to Firebase support explaining this, i will post the answer here once i have it.

Tom3652 commented 2 years ago

So you were right @russellwheatley here is the answer from Firebase support :

The onDisconnect() function is called when the client disconnects (we can use some examples such as Inactivity, or closing the app manually). In that case the client will send a signal to the server that it is disconnecting and the server will immediately execute the onDisconnect callback. When you switch off wifi, your app doesn't get a chance to tell the server that it is disconnecting. In that case the onDisconnect() callback will fire once the server detects that the client is gone. This may take a few minutes, so in that case you just have to be a bit more patient.

I have also asked how can i do then to set a user offline when he is not connected to the database, so that users don't see him online when he is not ?

But if you have an answer i would be extremely thankful.

But OnDisconnect works as expected :)

russellwheatley commented 2 years ago

I'm glad you got an answer, @Tom3652. I don't know how you would set it up using Firebase to be honest. I read that the OnDisconnect function can take up to 10 minutes to execute on the Firebase server.

Either way, you'll probably need a server to track connections. But that also sounds like a lot of work.

In the past, I've used socketsio Node server for web projects for chat apps which will also indicate with minimum latency when a client goes offline. A quick scan reveals iOS & android client setup. But then you'll probably have a problem with scale.

There might be a much easier and simple solution so take the above with a pinch of salt.

Tom3652 commented 2 years ago

Thanks for your comments and suggestion ! I will take some time to find a way good way that scales :)