जियोफेंसिंग एपीआई
ट्रैसलेट एक मजबूत, ऑफ़लाइन-प्रथम जियोफ़ेंसिंग इंजन प्रदान करता है। मानक ओएस जियोफेंसिंग के विपरीत, जो 20-100 जियोफेंस तक सीमित है और आपके ऐप को जगाने के लिए ओएस की आवश्यकता होती है, ट्रैसलेट रस्ट इंजन के भीतर आंतरिक रूप से जियोफेंस का मूल्यांकन करता है। यह शून्य अतिरिक्त बैटरी खपत के साथ असीमित जियोफेंस को सक्षम बनाता है।
1. वृत्ताकार बनाम बहुभुज भूबाड़ें
ट्रैसलेट मानक गोलाकार जियोफेंस और जटिल बहुभुज जियोफेंस दोनों का समर्थन करता है।
वृत्ताकार भूबाड़ें
एक वृत्ताकार भू-बाड़ को एक केंद्र निर्देशांक और एक त्रिज्या (मीटर में) द्वारा परिभाषित किया जाता है।
final circular = tl.Geofence(
identifier: 'headquarters',
latitude: 37.7749,
longitude: -122.4194,
radius: 200, // 200 meters
notifyOnEntry: true,
notifyOnExit: true,
notifyOnDwell: true, // Triggers if they stay inside
loiteringDelay: 300, // Trigger dwell after 5 minutes
);बहुभुज भूबाड़ें
एक बहुभुज भू-बाड़ को एक जटिल आकार (जैसे पार्क या इमारत) को रेखांकित करने वाले निर्देशांक की एक श्रृंखला द्वारा परिभाषित किया गया है।
final polygon = tl.Geofence.polygon(
identifier: 'golden_gate_park',
vertices: [
tl.Coordinate(latitude: 37.773972, longitude: -122.431297),
tl.Coordinate(latitude: 37.769996, longitude: -122.511055),
tl.Coordinate(latitude: 37.764516, longitude: -122.508566),
],
notifyOnEntry: true,
notifyOnExit: true,
);2. जियोफेंस जोड़ना और हटाना
ट्रैसलेट सभी जियोफेंस को स्थानीय SQLite डेटाबेस में संग्रहीत करता है। इसका मतलब है कि वे ऐप पुनरारंभ होने पर लगातार बने रहते हैं। हर बार ऐप लॉन्च होने पर आपको उन्हें दोबारा जोड़ने की ज़रूरत नहीं है।
जियोफेंस जोड़ना
आप एकल जियोफ़ेंस या जियोफ़ेंस की एक श्रृंखला जोड़ सकते हैं।
// Add a single geofence
await tl.Tracelet.addGeofence(circular);
// Add multiple geofences efficiently
await tl.Tracelet.addGeofences([circular, polygon]);जियोफेंस हटाना
उन्हें उनके विशिष्ट पहचानकर्ता द्वारा हटा दें, या संपूर्ण डेटाबेस साफ़ करें।
// Remove a specific geofence
await tl.Tracelet.removeGeofence('headquarters');
// Remove all geofences entirely
await tl.Tracelet.removeGeofences();3. सक्रिय जियोफेंस की सूची बनाना
आप किसी भी समय SQLite डेटाबेस से यह देखने के लिए क्वेरी कर सकते हैं कि वर्तमान में कौन से जियोफेंस की निगरानी की जा रही है।
final geofences = await tl.Tracelet.getGeofences();
for (final fence in geofences) {
print('Monitoring: \${fence.identifier}');
}4. जियोफ़ेंस इवेंट सुनना
जब उपयोगकर्ता जियोफेंस सीमा को पार करता है, तो ट्रैसलेट onGeofence ईवेंट को सक्रिय करता है। क्योंकि स्थान अपडेट के दौरान मूल्यांकन रस्ट कोर में होता है, ये ईवेंट सक्रिय हो जाएंगे भले ही ऐप बंद हो जाए (आपके हेडलेस कॉलबैक को ट्रिगर करना)।
tl.Tracelet.onGeofence((evt) {
if (evt.action == tl.GeofenceEventAction.ENTER) {
print('User entered: \${evt.identifier}');
} else if (evt.action == tl.GeofenceEventAction.EXIT) {
print('User exited: \${evt.identifier}');
} else if (evt.action == tl.GeofenceEventAction.DWELL) {
print('User is dwelling inside: \${evt.identifier}');
}
});5. एंड्रॉइड: अग्रभूमि सेवा और Google Play नीति
Google Play नीति में बदलाव - 28 अक्टूबर, 2026 से प्रभावी। जियोफेंसिंग नहीं है
अब अग्रभूमि सेवा स्थान के लिए अनुमत उपयोग का मामला। वे ऐप्स जो a. का उपयोग करते हैं
अग्रभूमि सेवा केवल जियोफेंसिंग के लिए इसे हटाना होगा
FOREGROUND_SERVICE_LOCATION (और FOREGROUND_SERVICE, यदि अन्यथा उपयोग न किया गया हो)
उनके मर्ज किए गए मेनिफेस्ट से अनुमतियाँ।
ट्रैसलेट का मानक जियोफेंस मोड मूल एंड्रॉइड जियोफेंस एपीआई का उपयोग करता है
(GeofencingClient), जो ENTER/EXIT सक्रिय करता है - और आपके ऐप को आपके में पुनः लॉन्च करता है
नेतृत्वहीन कार्य - जबकि ऐप निलंबित या समाप्त हो गया है, बिना a
अग्रभूमि सेवा. मानक मोड में startGeofences() को कॉल करना नहीं प्रारंभ होता है
एक अग्रभूमि सेवा (3.5.x के अनुसार), इसलिए यह डिफ़ॉल्ट रूप से अनुपालन योग्य है।
आक्रामक OEM (सैमसंग/Xiaomi/Huawei/OnePlus/Oppo/Vivo): 3.6.1 तक,
प्रत्येक डिवाइस पर एक स्पष्ट geofenceModeHighAccuracy: false का सम्मान किया जाता है। पहले
3.6.1 इन ओईएम ने चुपचाप उच्च-सटीकता मोड को मजबूर कर दिया - और इसके साथ
अग्रभूमि सेवा और इसकी सतत अधिसूचना - तब भी जब आप false सेट करते हैं,
जिसने उपरोक्त अनुरूप मानक-मोड पथ को तोड़ दिया। यदि आप इन उपकरणों को लक्षित करते हैं,
3.6.1 या बाद का उपयोग करें। आक्रामक OEM पर SDK अब एक विश्वसनीयता चेतावनी लॉग करता है
(मूल जियोफेंस डिलीवरी में देरी हो सकती है) आपके कॉन्फिगरेशन को ओवरराइड करने के बजाय।
यदि आप ट्रेसलेट का उपयोग केवल जियोफेंसिंग के लिए करते हैं
-
अग्रभूमि सेवा सक्षम नहीं करें:
await tl.Tracelet.ready(const tl.Config( android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig(enabled: false), ), geofence: tl.GeofenceConfig(geofenceModeHighAccuracy: false), )); await tl.Tracelet.startGeofences(); -
ट्रैसलेट एसडीके
FOREGROUND_SERVICE/FOREGROUND_SERVICE_LOCATIONघोषित करता है इसके निरंतर-ट्रैकिंग उपयोग के मामले के लिए। यदि आपका ऐप कभी भी निरंतर नहीं चलता है ट्रैकिंग, उन्हें मेनिफेस्ट-मर्जर के साथ मर्ज किए गए मेनिफेस्ट से हटा दें आपके ऐप केandroid/app/src/main/AndroidManifest.xmlमेंremoveनियम:<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" tools:node="remove" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" tools:node="remove" /> </manifest>
यदि आप निरंतर ट्रैकिंग और जियोफेंसिंग का उपयोग करते हैं
आप ट्रैकिंग उपयोग के मामले के लिए FOREGROUND_SERVICE_LOCATION रख सकते हैं (उदा.
नेविगेशन/बेड़े ट्रैकिंग), लेकिन अग्रभूमि सेवा का उपयोग नहीं किया जाना चाहिए
जियोफेंसिंग। ट्रेसलेट पहले से ही इसे संभालता है: एफजीएस निरंतर ट्रैकिंग के लिए चलता है
(start()), और जियोफेंस-ओनली मोड पर स्विच करना (मानक में startGeofences())
मोड) एफजीएस को नष्ट कर देता है।
उच्च-सटीकता जियोफ़ेंस मोड (geofenceModeHighAccuracy: true) का उपयोग करता है
चुस्त, इन-ऐप सीमा का पता लगाने के लिए निरंतर जीपीएस, जो चलता है
अग्रभूमि सेवा. वह सतत स्थान है - नीति में “जियोफेंसिंग” नहीं
अर्थ - इसलिए इसे केवल तभी सक्षम करें जब आपके ऐप के पास एक अलग अनुमत स्थान उपयोग हो
मामला। अधिकांश ऐप्स के लिए, मानक मोड सुसंगत और बैटरी-कुशल विकल्प है।
6. जीपीएस बहाव और झूठी निकास घटनाएं (उच्च सटीकता मोड)
उच्च-सटीकता मोड में, प्रत्येक जीपीएस फिक्स से ऐप में बदलाव का मूल्यांकन किया जाता है। ए एक छोटी सी जियोफेंस के अंदर स्थिर खड़ा उपकरण कभी-कभी प्राप्त कर सकता है एकल फिक्स जो त्रिज्या के बाहर अच्छी तरह से बहता है - भले ही वह कभी नहीं चला। को गलत EXIT को फायर करने से रोकें, ट्रेसलेट का निकास निर्णय है सटीकता-जागरूक: एक गोलाकार जियोफेंस केवल संपूर्ण जीपीएस त्रुटि के बाद ही बाहर निकलता है घेरा बाड़ को साफ़ करता है:
EXIT fires when: distance - horizontalAccuracy > radius + bufferएक फिक्स ने 160 मीटर बाहर की सूचना दी लेकिन ±150 मीटर सटीकता के साथ अधिकतम “10 मीटर बाहर” ही है आशावादी, इसलिए इसे अभी भी अंदर माना जाता है और कोई EXIT आग नहीं है। एक आश्वस्त, समान दूरी पर सटीक निर्धारण सामान्य रूप से बाहर निकलता है। ENTER जानबूझकर छोड़ा गया है सटीकता-अज्ञेयवादी, इसलिए आगमन अभी भी तुरंत शुरू हो जाता है।
अदला - बदली
चूँकि निकास सीमा सुधार की रिपोर्ट की गई सटीकता के साथ बढ़ती है, एक वास्तविक वर्तमान जीपीएस अनिश्चितता के कारण प्रस्थान में देरी हो रही है। 50 मीटर जियोफेंस के लिए (70 मीटर निकास सीमा):
| क्षैतिज सटीकता | बाहर निकलें ~ | पर आग लगती है | ------------------- | --------------- | | ±8 मीटर (अच्छा, आउटडोर) | 78 मीटर | | ±20 मीटर (सामान्य) | 90 मीटर | | ±50 मीटर (खराब) | 120 मीटर | | ±150 मीटर (बहुत खराब) | 220 मीटर |
अच्छे सिग्नल के साथ आउटडोर में यह नगण्य है। कालानुक्रमिक रूप से ख़राब-जीपीएस में स्थितियाँ (गहरे घर के अंदर, शहरी घाटियाँ) एक वास्तविक निकास में काफ़ी देरी हो सकती है।
इसे ट्यून करना: geofenceExitAccuracyMax
यदि आपका उपयोग मामला तेज़, अधिक उत्सुक निकास को प्राथमिकता देता है - या आप इसे बाध्य करना चाहते हैं
सबसे खराब स्थिति में देरी - GeofenceConfig.geofenceExitAccuracyMax सेट करें (मीटर में):
| मूल्य | व्यवहार |
|---|---|
-1 (डिफ़ॉल्ट) | पूर्ण सटीकता गेटिंग. बहाव-प्रेरित झूठे निकास के प्रति सबसे अधिक प्रतिरोधी; वर्तमान जीपीएस अनिश्चितता के कारण वास्तविक निकास में देरी हो सकती है। |
0 | गेटिंग अक्षम. जैसे ही रिपोर्ट किया गया बिंदु radius + buffer साफ़ हो जाता है, EXIT सक्रिय हो जाता है - सबसे तेज़ निकास, लेकिन एक एकल बहाव स्पाइक गलत EXIT उत्पन्न कर सकता है। |
N > 0 | दबाना. N मीटर तक बहाव को अवशोषित करें, लेकिन वास्तविक निकास को कभी भी ~N मीटर से अधिक विलंबित न करें। मिश्रित परिस्थितियों में छोटी बाड़ के लिए एक अच्छा मध्य मैदान (जैसे 20)। |
await tl.Tracelet.ready(const tl.Config(
geofence: tl.GeofenceConfig(
geofenceModeHighAccuracy: true,
// Absorb drift up to 20 m, but keep genuine exits reasonably prompt.
geofenceExitAccuracyMax: 20,
),
));यह गेटिंग केवल उच्च-सटीकता इन-ऐप पथ पर लागू होती है। मानक में
(OS क्षेत्र-निगरानी) मोड में ऑपरेटिंग सिस्टम EXIT का निर्णय लेता है, और
geofenceExitAccuracyMax का कोई प्रभाव नहीं पड़ता.
पुष्टिकृत निकास: एक भी ख़राब समाधान कभी भी निकास को ट्रिगर नहीं करता है
सटीकता गेटिंग तभी मदद करती है जब कोई ड्रिफ्टिंग फिक्स अपनी अनिश्चितता के बारे में ईमानदार हो
(बड़ी रिपोर्ट की गई सटीकता)। कुछ उपकरण इसके विपरीत कार्य करते हैं: वे एक उत्सर्जन करते हैं
अति-आत्मविश्वास ने बाड़ के बाहर सैकड़ों मीटर की दूरी तय की
कड़ी सटीकता की रिपोर्ट करना। क्योंकि रिपोर्ट की गई सटीकता छोटी है, गेटिंग
इसके आर-पार नहीं देख सकता - 200 m − 1.7 m = 198 m अभी भी सीमा को साफ़ करता है।
ट्रैसलेट इन्हें दूसरी, पूरक रक्षा के साथ पकड़ता है: एक EXIT होना चाहिए लगातार दो आउट-ऑफ़-फ़ेंस सुधारों की पुष्टि। तर्क यह है भौतिक - भूबाड़ छोड़ना एक निरंतर परिवर्तन है, जबकि एक अति-आत्मविश्वास गड़बड़ी हमेशा एक ही फिक्स होती है जो बाहर आती है और अगले ही पल वापस अंदर आ जाती है एक:
fix 1: 200 m out → held (pending confirmation), no EXIT
fix 2: back inside → pending cleared, glitch absorbedएक वास्तविक प्रस्थान बाहर रहता है, इसलिए दूसरा फिक्स इसकी पुष्टि करता है और बिल्कुल एक EXIT फ़ायर - केवल एक स्थान अपडेट (उच्च सटीकता में ≈1 s) के कारण विलंबित तरीका)। हिस्टैरिसीस निकास निर्णय का स्थानिक आधा हिस्सा है और यही है अस्थायी आधा; दोनों एक साथ काम करते हैं।
यह डिफ़ॉल्ट रूप से चालू है और इसके लिए किसी कॉन्फ़िगरेशन की आवश्यकता नहीं है. निर्णय जंग में रहता है कोर, इसलिए एंड्रॉइड और आईओएस समान व्यवहार करते हैं। (सटीकता गेटिंग की तरह, यह लागू होता है केवल उच्च-सटीकता इन-ऐप पथ के लिए - मानक ओएस क्षेत्र-निगरानी मोड में ऑपरेटिंग सिस्टम EXIT निर्णय का स्वामी है।)