Skip to Content
പ്രധാന ആശയങ്ങൾഫോർഗ്രൗണ്ട് സർവീസ് ഹെൽത്ത്

ഫോർഗ്രൗണ്ട് സർവീസ് ഹെൽത്ത്

ആൻഡ്രോയിഡിൽ, സ്ഥിരമായ ഫോർഗ്രൗണ്ട് സേവനമാണ് പശ്ചാത്തല ലൊക്കേഷൻ നിലനിർത്തുന്നത് ജീവനോടെ ട്രാക്കുചെയ്യുന്നു. എന്നാൽ ട്രാക്ക് ചെയ്യാൻ ആവശ്യപ്പെടുന്നത് (Tracelet.start()) എന്നതിന് സമാനമല്ല OS ** ഒരു റൺ ഫോർഗ്രൗണ്ട് സേവനം നൽകുന്നു. ആൻഡ്രോയിഡ് 12+ എ ഫോർഗ്രൗണ്ട്-സർവീസ് ആരംഭം മാറ്റിവയ്ക്കാം അല്ലെങ്കിൽ നിരസിക്കപ്പെടാം — നിങ്ങളുടെ ആപ്പ് സമയത്ത് പോലും ട്രാക്കിംഗ് പ്രവർത്തനക്ഷമമാണെന്ന് വിശ്വസിക്കുന്നു.

Tracelet.getForegroundServiceHealth() ആ വിടവ് അടയ്ക്കുന്നു. ഇത് റിപ്പോർട്ട് ചെയ്യുന്നു ഫോർഗ്രൗണ്ട് സേവനത്തിൻ്റെ ആധികാരിക മാതൃ അവസ്ഥ അതിനാൽ നിങ്ങൾക്ക് പറയാനാകും “ട്രാക്കിംഗ് അഭ്യർത്ഥിച്ചു”, “ട്രാക്കിംഗ് എന്നിവ തമ്മിലുള്ള വ്യത്യാസം യഥാർത്ഥത്തിൽ ആണ് ഓടുന്നു” — അവ വ്യതിചലിക്കുമ്പോൾ പ്രതികരിക്കുക.

** 3.6.6-ൽ പുതിയത് 3.6.5 (#253 ) കൂടാതെ 3.6.6 (#254 ) സേവനങ്ങൾ നിർമ്മിക്കുന്നതിലൂടെ ഡാർട്ടിൽ നിന്ന് നിരീക്ഷിക്കാവുന്ന യഥാർത്ഥ അവസ്ഥ.


എന്തുകൊണ്ട് enabled പോരാ

Tracelet.getState().enabled എന്നത് ആവശ്യമുള്ള അവസ്ഥയാണ് - നിരന്തരമായ ഉദ്ദേശ്യം ട്രാക്ക്. ഇത് ഉത്തരം “ആപ്പ് ട്രാക്ക് ചെയ്യാൻ ആവശ്യപ്പെട്ടിട്ടുണ്ടോ?”, അല്ല ” യഥാർത്ഥത്തിൽ OS ആണോ ഇപ്പോൾ ഫോർഗ്രൗണ്ട് സർവീസ് നടത്തുന്നുണ്ടോ?”.

അവയ്ക്ക് വ്യത്യാസമുണ്ടാകാം, പ്രത്യേകിച്ച് Android 12+ (API 31+), ആരംഭിക്കുന്നിടത്ത് a പശ്ചാത്തലത്തിൽ നിന്നുള്ള location ഫോർഗ്രൗണ്ട് സേവനം നിയന്ത്രിച്ചിരിക്കുന്നു:

  • ആരംഭം മാറ്റിവയ്ക്കാം — ആപ്പ് ആയിരിക്കുമ്പോൾ Android അത് നിരസിക്കുന്നു പശ്ചാത്തലമാക്കി, അടുത്തതായി ആപ്പ് തിരികെ വരുമ്പോൾ Tracelet സ്വയമേവ വീണ്ടും ശ്രമിക്കുന്നു മുൻഭാഗം.
  • തുടക്കം പരാജയപ്പെടാം - ഉദാ. നഷ്‌ടമായ അനുമതി, അല്ലെങ്കിൽ എ വിവർത്തനം ചെയ്യരുത്.
  • ഈ സേവനം സിസ്റ്റം വഴി പ്രമോട്ടുചെയ്യാനും തുടർന്ന് നിർത്താനും കഴിയും.

ഈ സാഹചര്യങ്ങളിലെല്ലാം enabled true ആയി തുടരുന്നു, എന്നാൽ പശ്ചാത്തല ട്രാക്കിംഗ് അല്ല പ്രവർത്തനക്ഷമമായ. ഒരു ലൊക്കേഷൻ-ടൈംസ്റ്റാമ്പ് വാച്ച്‌ഡോഗിന് കാലക്രമേണ കാലപ്പഴക്കം ശ്രദ്ധിക്കാൻ കഴിയും, പക്ഷേ എന്തുകൊണ്ട് — പ്രമോഷൻ പരാജയപ്പെട്ടോ, സേവനം നിർത്തിയോ, അല്ലെങ്കിൽ ദാതാവ് ഒരു പുതിയ പരിഹാരത്തിനായി കാത്തിരിക്കുകയാണ്. getForegroundServiceHealth() നിങ്ങൾക്ക് യഥാർത്ഥവും ആധികാരികവുമായ കാരണം നൽകുന്നു.


API

final health = await Tracelet.getForegroundServiceHealth();

ഇനിപ്പറയുന്ന കീകൾ ഉപയോഗിച്ച് ഒരു Map<String, Object?> നൽകുന്നു:

താക്കോൽതരംഅർത്ഥം
desiredEnabledനോട്ട്രാൻസ്1ലേറ്റ്നിലനിൽക്കുന്ന ആവശ്യമുള്ള ട്രാക്കിംഗ് അവസ്ഥ (getState().enabled പോലെ തന്നെ).
foregroundServiceEnabledനോട്ട്രാൻസ്1ലേറ്റ്സജീവ കോൺഫിഗറേഷൻ ഒരു ഫോർഗ്രൗണ്ട് സർവീസ് പ്രവർത്തിപ്പിക്കുന്നുണ്ടോ.
serviceRunningനോട്ട്രാൻസ്1ലേറ്റ്നേറ്റീവ് ലൊക്കേഷൻ സേവന പ്രക്രിയ സജീവമാണോ എന്ന്.
serviceForegroundനോട്ട്രാൻസ്1ലേറ്റ്സേവനം നിലവിൽ പ്രമോട്ടുചെയ്‌തിട്ടുണ്ടോ (അവസാനം startForeground() വിജയിച്ചു, അതിനുശേഷം അത് തരംതാഴ്ത്തുകയോ/നിർത്തുകയോ ചെയ്‌തിട്ടില്ല).
foregroundNotificationIdനോട്ട്രാൻസ്1ലേറ്റ്പ്രമോട്ടുചെയ്യുമ്പോൾ അറിയിപ്പ് ഐഡി; അല്ലാത്തപക്ഷം null.
lastForegroundPromotionResultനോട്ട്രാൻസ്1ലേറ്റ്success, deferred, അല്ലെങ്കിൽ failed - ഏറ്റവും പുതിയ പ്രമോഷൻ ശ്രമത്തിൻ്റെ ഫലം (ഏത് ശ്രമത്തിനും മുമ്പ് null).
lastForegroundPromotionFailureClassനോട്ട്രാൻസ്1ലേറ്റ്അവസാനമായി പരാജയപ്പെട്ട/മാറ്റിവെച്ച പ്രമോഷൻ്റെ ഒഴിവാക്കൽ ക്ലാസ് (ഉദാ. ForegroundServiceStartNotAllowedException).
lastForegroundPromotionFailureMessageനോട്ട്രാൻസ്1ലേറ്റ്ഒഴിവാക്കൽ സന്ദേശം.
lastForegroundTransitionAtനോട്ട്രാൻസ്1ലേറ്റ്അവസാന പ്രമോഷൻ സംക്രമണത്തിൻ്റെ യുഗ-മില്ലിസെക്കൻഡ്.
platformനോട്ട്രാൻസ്1ലേറ്റ്android, ios, അല്ലെങ്കിൽ web.

എല്ലാ പ്ലാറ്റ്‌ഫോമിലും മാപ്പ് ആകൃതി മനഃപൂർവ്വം സമാനമാണ്, അതിനാൽ ക്രോസ്-പ്ലാറ്റ്ഫോം കോഡ് ഒരേപോലെ വായിക്കാൻ കഴിയും. ഓരോ പ്ലാറ്റ്‌ഫോമിലും മൂല്യങ്ങൾ മാത്രം വ്യത്യാസപ്പെട്ടിരിക്കുന്നു (ചുവടെ കാണുക).


പ്രമോഷൻ ഫലം വായിക്കുന്നു

serviceForeground, lastForegroundPromotionResult എന്നിവയുമായി ചേർന്ന് നിങ്ങളോട് പറയുന്നു മുഴുവൻ കഥയും:

desiredEnabledനോട്ട്രാൻസ്1ലേറ്റ്lastForegroundPromotionResultവ്യാഖ്യാനം
falseനോട്ട്രാൻസ്1ലേറ്റ്ഏതെങ്കിലുംട്രാക്കിംഗ് ഓഫാണ് - വിഷമിക്കേണ്ട കാര്യമില്ല.
trueനോട്ട്രാൻസ്1ലേറ്റ്successആരോഗ്യകരമായ — ഫോർഗ്രൗണ്ട് സേവനം പ്രവർത്തിക്കുകയും പ്രമോട്ടുചെയ്യുകയും ചെയ്യുന്നു.
trueനോട്ട്രാൻസ്1ലേറ്റ്deferredമാറ്റിവെച്ചിരിക്കുന്നു — പശ്ചാത്തലത്തിലായിരിക്കുമ്പോൾ ആൻഡ്രോയിഡ് ആരംഭം നിരസിച്ചു; ആപ്പ് ഫോർഗ്രൗണ്ടിലേക്ക് മടങ്ങുമ്പോൾ Tracelet വീണ്ടും ശ്രമിക്കും.
trueനോട്ട്രാൻസ്1ലേറ്റ്failedപരാജയപ്പെട്ടു — പ്രമോഷൻ പരാജയപ്പെട്ടു; പശ്ചാത്തല ട്രാക്കിംഗ് അല്ല പ്രവർത്തനക്ഷമമല്ല. പരാജയ ക്ലാസ്/സന്ദേശം പരിശോധിക്കുക.
trueനോട്ട്രാൻസ്1ലേറ്റ്null⌛ അഭ്യർത്ഥിച്ചെങ്കിലും ഇതുവരെ സ്ഥിരീകരിച്ചിട്ടില്ല (ക്ഷണികം - ഉടൻ വീണ്ടും വോട്ടെടുപ്പ്).

ഒരു ട്രാക്കിംഗ്-ആരോഗ്യ സൂചകം

ഏറ്റവും സാധാരണമായ ഉപയോഗം: ഉപയോക്താവിന് (അല്ലെങ്കിൽ നിങ്ങളുടെ ടെലിമെട്രി) സത്യസന്ധമായ നില enabled നെ അന്ധമായി വിശ്വസിക്കുന്നതിനുപകരം.

Future<String> describeTrackingHealth() async { final h = await Tracelet.getForegroundServiceHealth(); if (h['desiredEnabled'] != true) return 'Tracking off'; // iOS/web have no foreground service — enabled tracking is as good as it gets. if (h['platform'] != 'android') return 'Tracking active'; if (h['serviceForeground'] == true) return 'Tracking active'; switch (h['lastForegroundPromotionResult']) { case 'deferred': return 'Waiting to start — reopen the app to resume background tracking'; case 'failed': final reason = h['lastForegroundPromotionFailureMessage'] ?? 'unknown'; return 'Background tracking failed to start: $reason'; default: return 'Starting…'; } }

ഒരു റിക്കവറി വാച്ച്ഡോഗ്

പരാജയപ്പെട്ടത് കണ്ടെത്താനും വീണ്ടെടുക്കാനും ആരോഗ്യ പരിശോധന ഒരു ആനുകാലിക ടൈമർ ഉപയോഗിച്ച് ജോടിയാക്കുക പ്രൊമോഷൻ - ഉദാഹരണത്തിന്, ആപ്പ് വീണ്ടും തുറക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുക, അല്ലെങ്കിൽ വീണ്ടും അഭ്യർത്ഥിക്കുക അനുമതി നഷ്‌ടപ്പെട്ടു.

Timer.periodic(const Duration(minutes: 1), (_) async { final h = await Tracelet.getForegroundServiceHealth(); final desired = h['desiredEnabled'] == true; final foreground = h['serviceForeground'] == true; final result = h['lastForegroundPromotionResult']; if (desired && !foreground && result == 'failed') { // Background tracking is not operational. Log it, alert your backend, // or guide the user to fix permissions / battery settings. await reportTrackingDegraded( failureClass: h['lastForegroundPromotionFailureClass'], failureMessage: h['lastForegroundPromotionFailureMessage'], ); } });

serviceForeground അവസാനത്തെ പ്രമോഷൻ ഫലത്തെ പ്രതിഫലിപ്പിക്കുന്നു, തത്സമയ വോട്ടെടുപ്പ് അല്ല ഓരോ മില്ലിസെക്കൻഡിലും OS. start()-ന് തൊട്ടുപിന്നാലെ, പ്രമോഷൻ ഒരു അടിയായി പിന്നീട് - നിങ്ങൾക്ക് ഏറ്റവും പുതിയ മൂല്യം വേണമെങ്കിൽ ഒരു ചെറിയ കാലതാമസത്തിന് ശേഷം (1-2 സെ) വീണ്ടും വോട്ടെടുപ്പ് നടത്തുക.


പ്ലാറ്റ്ഫോം പെരുമാറ്റം

പ്ലാറ്റ്ഫോംപെരുമാറ്റം
ആൻഡ്രോയിഡ്തത്സമയ ഫോർഗ്രൗണ്ട്-സർവീസ് സ്റ്റേറ്റും പ്രമോഷൻ ചരിത്രവും കൊണ്ട് പൂർണ്ണമായി ജനസംഖ്യയുള്ളതാണ്.
iOSവസ്തുതയ്ക്ക് ശേഷം പരാജയപ്പെടാവുന്ന ഫോർഗ്രൗണ്ട് സേവനങ്ങളൊന്നുമില്ല, അതിനാൽ serviceForeground false ആണ്, foregroundServiceEnabled false ആണ്, കൂടാതെ പ്രമോഷൻ ഫീൽഡുകൾ null ആണ്. ട്രാക്കിംഗ് സജീവമാണോ എന്ന് desiredEnabled, serviceRunning എന്നിവ പ്രതിഫലിപ്പിക്കുന്നു. platform എന്നത് ios ആണ്.
വെബ്ഫോർഗ്രൗണ്ട് സർവീസ് ഇല്ല. ആവശ്യമുള്ള അവസ്ഥയെ പ്രതിഫലിപ്പിക്കുന്ന ഏറ്റവും കുറഞ്ഞ മാപ്പ് നൽകുന്നു; platform എന്നത് web ആണ്.

അതുകൊണ്ടാണ് മുൻനിര-സേവന പ്രമോഷൻ റേസ് iOS-നെ ബാധിക്കാത്തത് #253  എന്നതിലും ആൻഡ്രോയിഡിനായി പരിഹരിച്ചു #254 : iOS-ന് പ്രത്യേകം ഒന്നുമില്ല പ്രൊമോട്ട് ചെയ്യാനും പിന്നീട് പൊളിക്കാനുമുള്ള മുൻനിര-സേവന പ്രക്രിയ.


Tracelet ഡോക്ടറിൽ

ഇതൊന്നും കാണാൻ നിങ്ങൾ സ്വയം നിർമ്മിക്കേണ്ടതില്ല. ദി tracelet_doctor ഓവർലേയിൽ ഇപ്പോൾ ഒരു ഫോർഗ്രൗണ്ട് ഉൾപ്പെടുന്നു ഈ വിവരങ്ങൾ കൃത്യമായി റെൻഡർ ചെയ്യുന്ന സേവന കാർഡ് — ആവശ്യമുള്ളവയും യഥാർത്ഥവും, പ്രമോഷൻ ഫലം, ഏതെങ്കിലും പരാജയ ക്ലാസ്/സന്ദേശം - കളർ കോഡഡ് സ്റ്റാറ്റസോടെ (ആരോഗ്യമുള്ളത് / മാറ്റിവച്ചത് / പരാജയപ്പെട്ടത് / നിഷ്ക്രിയം).

tracelet_doctor ഒരു ദേവാശ്രയമാണ് (flutter pub add dev:tracelet_doctor), അതിനാൽ kDebugMode ഉപയോഗിച്ച് സംരക്ഷിക്കുക:

import 'package:flutter/foundation.dart' show kDebugMode; import 'package:tracelet_doctor/tracelet_doctor.dart'; if (kDebugMode) { TraceletDoctor.show(context); // includes the Foreground Service card }

ഇതേ ഫീൽഡുകൾ ബഗ് റിപ്പോർട്ടിലും (TraceletBugReport.build()) അതിനാൽ ഫോർഗ്രൗണ്ട് സേവനം യഥാർത്ഥത്തിൽ പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് ഒട്ടിച്ച റിപ്പോർട്ട് കാണിക്കുന്നു പ്രശ്‌നത്തിൻ്റെ സമയം - പലപ്പോഴും “ട്രാക്കിംഗ് നിർത്തുന്നത്” എന്നതിലെ നഷ്‌ടമായ സൂചന പശ്ചാത്തലം” റിപ്പോർട്ടുകൾ.


അറിഞ്ഞത് നന്നായി

  • വായിക്കാൻ മാത്രം & വിലകുറഞ്ഞത്. കോൾ ഇൻ-മെമ്മറി നേറ്റീവ് സ്റ്റേറ്റ് വായിക്കുന്നു; അത് ഒരിക്കലും ട്രാക്കിംഗ് ആരംഭിക്കുന്നു, നിർത്തുന്നു അല്ലെങ്കിൽ മ്യൂട്ടേറ്റ് ചെയ്യുന്നു.
  • ready()-ന് മുമ്പ് സുരക്ഷിതം. ഇത് ഒരു സുബോധമുള്ള ഡിഫോൾട്ട് സ്നാപ്പ്ഷോട്ട് നൽകുന്നു. SDK ആരംഭിച്ചിട്ടില്ലെങ്കിൽ എറിയുക.
  • ആവശ്യമായത് വേഴ്സസ് യഥാർത്ഥമാണ്. ഇതിനായി getState().enabled ഉപയോഗിക്കുന്നത് തുടരുക നിങ്ങളുടെ ആപ്പിൻ്റെ ഉദ്ദേശം; OS ആണോ എന്ന് പരിശോധിക്കാൻ getForegroundServiceHealth() ഉപയോഗിക്കുക ആ ഉദ്ദേശ്യത്തെ മാനിക്കുന്നു.
Last updated on