முன்புற சேவை ஆரோக்கியம்
ஆண்ட்ராய்டில், ஒரு நிலையான முன்புற சேவையே பின்புல இருப்பிடத்தை பராமரிக்கிறது
உயிருடன் கண்காணிக்கிறது. ஆனால் கண்காணிக்க **கேட்பது (Tracelet.start()) போன்றது அல்ல
இயங்கும் முன்புற சேவையை OS ** வழங்குகிறது. Android 12+ இல் a
முன்-சேவை தொடக்கம் ஒத்திவைக்கப்படலாம் அல்லது நிராகரிக்கப்படலாம் — உங்கள் பயன்பாட்டில் கூட
கண்காணிப்பு இயக்கப்பட்டதாக நம்புகிறது.
Tracelet.getForegroundServiceHealth() அந்த இடைவெளியை மூடுகிறது. இது தெரிவிக்கிறது
முன்புற சேவையின் அதிகாரப்பூர்வ சொந்த நிலை எனவே நீங்கள் சொல்லலாம்
“கண்காணிப்பு கோரப்பட்டது” மற்றும் “கண்காணிப்பு உண்மையில் உள்ளது
இயங்கும்” — மற்றும் அவை வேறுபடும் போது எதிர்வினையாற்றுகின்றன.
enabled ஏன் போதாது
Tracelet.getState().enabled என்பது விரும்பிய நிலை — தொடர்ந்து வரும் நோக்கம்
தடம். இது “பயன்பாடு கண்காணிக்கச் சொல்லியிருக்கிறதா?”, இல்லை “உண்மையில் OSதானா?
இப்போது முன்புற சேவையை இயக்குகிறதா?”.
குறிப்பாக ஆண்ட்ராய்டு 12+ (API 31+) இல் அவை வேறுபடலாம்
பின்னணியில் இருந்து location முன்புற சேவை தடைசெய்யப்பட்டுள்ளது:
- தொடக்கமானது ஒத்திவைக்கப்படலாம் — பயன்பாடு இருக்கும் போது Android அதை மறுக்கிறது பின்புலமானது, மேலும் ஆப்ஸ் அடுத்ததாக திரும்பும் போது ட்ரேஸ்லெட் தானாகவே மீண்டும் முயற்சிக்கும் முன்புறம்.
- தொடக்கமானது தோல்வியடையலாம் - எ.கா. விடுபட்ட அனுமதி, அல்லது ஏ தாமதமாக இல்லை.
- இந்த சேவையை கணினி மூலம் மேம்படுத்தலாம், பின்னர் நிறுத்தலாம்.
இந்த எல்லா நிகழ்வுகளிலும் enabled true ஆக இருக்கும், ஆனால் பின்னணி கண்காணிப்பு இல்லை
செயல்பாட்டு. ஒரு இருப்பிட நேர முத்திரை கண்காணிப்புக் குழு இறுதியில் தேக்கத்தை கவனிக்க முடியும், ஆனால்
ஏன் - பதவி உயர்வு தோல்வியடைந்ததா, சேவை நிறுத்தப்பட்டதா, அல்லது
வழங்குநர் ஒரு புதிய திருத்தத்திற்காக காத்திருக்கிறார். நாட்ரான்ஸ்0லேட்
உண்மையான, அதிகாரபூர்வமான காரணத்தை உங்களுக்கு வழங்குகிறது.
API
final health = await Tracelet.getForegroundServiceHealth();பின்வரும் விசைகளுடன் Map<String, Object?> ஐ வழங்கும்:
| திறவுகோல் | வகை | பொருள் |
|---|---|---|
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | தொடர்ந்து இருக்கும் விரும்பிய கண்காணிப்பு நிலை (getState().enabled போன்றது). |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | செயலில் உள்ள கட்டமைப்பு முன்புற சேவையை இயக்குகிறதா. |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | சொந்த இருப்பிட சேவை செயல்முறை உயிருடன் உள்ளதா. |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | சேவையானது **தற்போது விளம்பரப்படுத்தப்பட்டுள்ளதா |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | பதவி உயர்வு பெறும்போது அறிவிப்பு ஐடி; null இல்லையெனில். |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | success, deferred அல்லது failed — மிக சமீபத்திய பதவி உயர்வு முயற்சியின் விளைவு (எந்த முயற்சிக்கும் முன் null). |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | கடைசியாக தோல்வியுற்ற/ ஒத்திவைக்கப்பட்ட பதவி உயர்வுக்கான விதிவிலக்கு வகுப்பு (எ.கா. ForegroundServiceStartNotAllowedException). |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | விதிவிலக்கு செய்தி. |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | கடைசி பதவி உயர்வு மாற்றத்தின் சகாப்தம்-மில்லி விநாடிகள். |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | நோட்ரான்ஸ்2லேட், நோட்ரான்ஸ்3லேட் அல்லது நோட்ரான்ஸ்4லேட். |
வரைபட வடிவம் வேண்டுமென்றே ஒவ்வொரு தளத்திலும் ஒரே மாதிரியாக இருக்கும், எனவே குறுக்கு-தளம் குறியீடு ஒரே சீராக படிக்க முடியும். ஒரு தளத்திற்கு மதிப்புகள் மட்டுமே வேறுபடுகின்றன (கீழே காண்க).
பதவி உயர்வு முடிவைப் படித்தல்
lastForegroundPromotionResult உடன் இணைந்து serviceForeground உங்களுக்கு சொல்கிறது
முழு கதை:
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | நோட்ரான்ஸ்2லேட் | விளக்கம் |
|---|---|---|---|
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | ஏதேனும் | கண்காணிப்பு முடக்கப்பட்டுள்ளது - கவலைப்பட ஒன்றுமில்லை. |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | நோட்ரான்ஸ்2லேட் | ✅ ஆரோக்கியமான — முன்புற சேவை இயங்கி வருகிறது. |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | நோட்ரான்ஸ்2லேட் | ⏳ ஒத்திவைக்கப்பட்டது — பின்புலத்தில் இருக்கும் போது Android தொடக்கத்தை மறுத்தது; ஆப்ஸ் முன்புறத்திற்குத் திரும்பும்போது ட்ரேஸ்லெட் மீண்டும் முயற்சிக்கும். |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | நோட்ரான்ஸ்2லேட் | ❌ தோல்வி — பதவி உயர்வு தோல்வி; பின்னணி கண்காணிப்பு இல்லை செயல்பாட்டில் உள்ளது. தோல்வி வகுப்பு/செய்தியை ஆய்வு செய்யவும். |
| நோட்ரான்ஸ்0லேட் | நோட்ரான்ஸ்1லேட் | நோட்ரான்ஸ்2லேட் | ⌛ கோரப்பட்டது, ஆனால் இன்னும் உறுதிப்படுத்தப்படவில்லை (நிலையானது - விரைவில் மீண்டும் வாக்கெடுப்பு). |
ஒரு கண்காணிப்பு-சுகாதார காட்டி
மிகவும் பொதுவான பயன்பாடு: பயனருக்கு நேர்மையான நிலையை வெளிப்படுத்தவும் (அல்லது உங்கள் டெலிமெட்ரி)
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 வினாடிகள்) மீண்டும் வாக்களிக்கவும்.
மேடை நடத்தை
| மேடை | நடத்தை |
|---|---|
| Android | நேரடி முன்-சேவை நிலை மற்றும் பதவி உயர்வு வரலாறு ஆகியவற்றுடன் முழுமையாக மக்கள்தொகை கொண்டது. |
| iOS | உண்மைக்குப் பிறகு தோல்வியடையும் எந்த முன்புற சேவையும் இல்லை, எனவே serviceForeground என்பது false, foregroundServiceEnabled என்பது false, மற்றும் விளம்பரப் புலங்கள் null ஆகும். கண்காணிப்பு செயலில் உள்ளதா என்பதை desiredEnabled மற்றும் serviceRunning பிரதிபலிக்கிறது. platform என்பது ios ஆகும். |
| வலை | முன்புற சேவை இல்லை. விரும்பிய நிலையை பிரதிபலிக்கும் குறைந்தபட்ச வரைபடத்தை வழங்குகிறது; platform என்பது web ஆகும். |
ட்ரேஸ்லெட் டாக்டரில்
பார்க்க இவற்றை நீங்களே உருவாக்க வேண்டியதில்லை. தி
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()ஐப் பயன்படுத்தவும் அந்த நோக்கத்தை மதிக்கிறது.