Geofencing آگاهی از موقعیت مکانی فعلی کاربر را با آگاهی از نزدیکی کاربر به مکان هایی که ممکن است مورد علاقه باشد ترکیب می کند. برای علامت گذاری یک مکان مورد علاقه، طول و عرض جغرافیایی آن را مشخص می کنید. برای تنظیم نزدیکی مکان، یک شعاع اضافه میکنید. عرض جغرافیایی، طول جغرافیایی و شعاع، یک ژئوفنس را تعریف می کند و یک ناحیه دایره ای یا حصار در اطراف محل مورد نظر ایجاد می کند.
شما می توانید چندین geofences فعال با محدودیت 100 در هر برنامه، برای هر کاربر دستگاه داشته باشید. برای هر geofence، میتوانید از خدمات موقعیت مکانی بخواهید رویدادهای ورودی و خروجی را برای شما ارسال کند، یا میتوانید مدت زمانی را در ناحیه geofence تعیین کنید تا قبل از شروع یک رویداد منتظر بمانید یا در آن اقامت کنید . شما می توانید با تعیین مدت زمان انقضا بر حسب میلی ثانیه، مدت زمان هر geofence را محدود کنید. پس از انقضای geofence، Location Services به طور خودکار آن را حذف می کند.
این درس به شما نشان می دهد که چگونه geofences را اضافه و حذف کنید، و سپس با استفاده از BroadcastReceiver
به انتقال geofence گوش دهید.
توجه: در دستگاههای Wear، APIهای Geofencing از قدرت استفاده مؤثری نمیکنند. ما این API ها را در Wear توصیه نمی کنیم. برای اطلاعات بیشتر صرفه جویی در مصرف برق و باتری را بخوانید.
برای مانیتورینگ geofence تنظیم کنید
اولین قدم در درخواست مانیتورینگ geofence، درخواست مجوزهای لازم است. برای استفاده از geofencing، برنامه شما باید موارد زیر را درخواست کند:
-
ACCESS_FINE_LOCATION
- اگر برنامه شما Android 10 (سطح API 29) یا بالاتر را هدف قرار می دهد
ACCESS_BACKGROUND_LOCATION
برای کسب اطلاعات بیشتر، راهنمای نحوه درخواست مجوزهای مکان را ببینید.
اگر میخواهید از BroadcastReceiver
برای گوش دادن به انتقال geofence استفاده کنید، عنصری را اضافه کنید که نام سرویس را مشخص میکند. این عنصر باید فرزند عنصر <application>
باشد:
<application android:allowBackup="true"> ... <receiver android:name=".GeofenceBroadcastReceiver"/> <application/>
برای دسترسی به API های مکان، باید یک نمونه از مشتری Geofencing ایجاد کنید. برای یادگیری نحوه اتصال مشتری:
کاتلین
lateinit var geofencingClient: GeofencingClient override fun onCreate(savedInstanceState: Bundle?) { // ... geofencingClient = LocationServices.getGeofencingClient(this) }
جاوا
private GeofencingClient geofencingClient; @Override public void onCreate(Bundle savedInstanceState) { // ... geofencingClient = LocationServices.getGeofencingClient(this); }
ایجاد و اضافه کردن geofences
برنامه شما باید با استفاده از کلاس سازنده API موقعیت مکانی برای ایجاد اشیاء Geofence و کلاس راحتی برای افزودن آنها، geofences ایجاد و اضافه کند. همچنین، برای رسیدگی به مقاصد ارسال شده از Location Services هنگامی که انتقال geofence رخ می دهد، می توانید PendingIntent
را همانطور که در این بخش نشان داده شده است تعریف کنید.
توجه: در دستگاههای تک کاربره، برای هر برنامه، محدودیت 100 geofence وجود دارد. برای دستگاه های چند کاربره، این محدودیت 100 geofence در هر برنامه برای هر کاربر دستگاه است.
ایجاد اشیاء geofence
ابتدا از Geofence.Builder
برای ایجاد geofence استفاده کنید و شعاع، مدت زمان و انواع انتقال مورد نظر را برای geofence تنظیم کنید. به عنوان مثال، برای پر کردن یک شی لیست:
کاتلین
geofenceList.add(Geofence.Builder() // Set the request ID of the geofence. This is a string to identify this // geofence. .setRequestId(entry.key) // Set the circular region of this geofence. .setCircularRegion( entry.value.latitude, entry.value.longitude, Constants.GEOFENCE_RADIUS_IN_METERS ) // Set the expiration duration of the geofence. This geofence gets automatically // removed after this period of time. .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) // Set the transition types of interest. Alerts are only generated for these // transition. We track entry and exit transitions in this sample. .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT) // Create the geofence. .build())
جاوا
geofenceList.add(new Geofence.Builder() // Set the request ID of the geofence. This is a string to identify this // geofence. .setRequestId(entry.getKey()) .setCircularRegion( entry.getValue().latitude, entry.getValue().longitude, Constants.GEOFENCE_RADIUS_IN_METERS ) .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .build());
این مثال داده ها را از یک فایل ثابت می کشد. در عمل واقعی، برنامه ها ممکن است به صورت پویا بر اساس موقعیت مکانی کاربر، geofences ایجاد کنند.
ژئوفنس ها و محرک های اولیه را مشخص کنید
قطعه زیر از کلاس GeofencingRequest
و کلاس GeofencingRequestBuilder
تودرتو برای تعیین geofences برای نظارت و تنظیم چگونگی راه اندازی رویدادهای geofence مرتبط استفاده می کند:
کاتلین
private fun getGeofencingRequest(): GeofencingRequest { return GeofencingRequest.Builder().apply { setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER) addGeofences(geofenceList) }.build() }
جاوا
private GeofencingRequest getGeofencingRequest() { GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(geofenceList); return builder.build(); }
این مثال استفاده از دو تریگر geofence را نشان می دهد. انتقال GEOFENCE_TRANSITION_ENTER
زمانی فعال میشود که دستگاهی وارد یک geofence میشود، و انتقال GEOFENCE_TRANSITION_EXIT
زمانی که دستگاهی از geofence خارج میشود فعال میشود. مشخص کردن INITIAL_TRIGGER_ENTER
به خدمات موقعیت مکانی می گوید که اگر دستگاه از قبل در داخل geofence باشد GEOFENCE_TRANSITION_ENTER
باید راه اندازی شود.
در بسیاری از موارد، ممکن است ترجیح داده شود که به جای آن از INITIAL_TRIGGER_DWELL
استفاده شود، که رویدادها را تنها زمانی فعال می کند که کاربر برای مدت زمان مشخصی در یک geofence متوقف شود. این رویکرد میتواند به کاهش «هرزنامههای هشدار» ناشی از اعلانهای تعداد زیاد هنگام ورود و خروج یک دستگاه به geofenceها برای مدت کوتاهی کمک کند. استراتژی دیگر برای گرفتن بهترین نتایج از ژئوفنس خود، تنظیم حداقل شعاع 100 متر است. این به محاسبه دقت مکان شبکههای Wi-Fi معمولی کمک میکند و همچنین به کاهش مصرف انرژی دستگاه کمک میکند.
یک گیرنده پخش برای انتقال geofence تعریف کنید
یک Intent
ارسال شده از Location Services میتواند اقدامات مختلفی را در برنامه شما راهاندازی کند، اما نباید از آن بخواهید فعالیت یا قطعهای را شروع کند، زیرا مؤلفهها فقط باید در پاسخ به عملکرد کاربر قابل مشاهده باشند. در بسیاری از موارد، BroadcastReceiver
یک راه خوب برای مدیریت انتقال geofence است. یک BroadcastReceiver
هنگامی که رویدادی رخ می دهد، مانند انتقال به یا خارج از یک geofence، به روز رسانی ها را دریافت می کند و می تواند کار پس زمینه طولانی مدت را شروع کند.
قطعه زیر نحوه تعریف PendingIntent
را نشان می دهد که یک BroadcastReceiver
راه اندازی می کند:
کاتلین
class MainActivity : AppCompatActivity() { // ... private val geofencePendingIntent: PendingIntent by lazy { val intent = Intent(this, GeofenceBroadcastReceiver::class.java) // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling // addGeofences() and removeGeofences(). PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } }
جاوا
public class MainActivity extends AppCompatActivity { // ... private PendingIntent getGeofencePendingIntent() { // Reuse the PendingIntent if we already have it. if (geofencePendingIntent != null) { return geofencePendingIntent; } Intent intent = new Intent(this, GeofenceBroadcastReceiver.class); // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when // calling addGeofences() and removeGeofences(). geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent. FLAG_UPDATE_CURRENT); return geofencePendingIntent; }
geofences را اضافه کنید
برای افزودن geofences، از متد
استفاده کنید. شی GeofencingClient.addGeofences()
GeofencingRequest
و PendingIntent
ارائه دهید. قطعه زیر پردازش نتایج را نشان می دهد:
کاتلین
geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run { addOnSuccessListener { // Geofences added // ... } addOnFailureListener { // Failed to add geofences // ... } }
جاوا
geofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent()) .addOnSuccessListener(this, new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Geofences added // ... } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Failed to add geofences // ... } });
انتقال geofence را مدیریت کنید
هنگامی که Location Services تشخیص می دهد که کاربر وارد یک geofence شده یا از آن خارج شده است، Intent
موجود در PendingIntent
را که در درخواست اضافه کردن geofences درج کرده اید، ارسال می کند. یک گیرنده پخش مانند GeofenceBroadcastReceiver
متوجه می شود که Intent
فراخوانی شده است و سپس می تواند رویداد geofence را از intent بدست آورد، نوع انتقال(های) Geofence را تعیین کند و تعیین کند که کدام یک از geofence های تعریف شده راه اندازی شده است. گیرنده پخش میتواند یک برنامه را هدایت کند تا کار پسزمینه را شروع کند یا در صورت تمایل، یک اعلان به عنوان خروجی ارسال کند.
توجه: در Android 8.0 (سطح API 26) و بالاتر، اگر برنامهای در پسزمینه اجرا میشود و حین نظارت بر geofence، دستگاه هر چند دقیقه به رویدادهای geofencing پاسخ میدهد. برای یادگیری نحوه تطبیق برنامه خود با این محدودیتهای پاسخ، به محدودیتهای موقعیت مکانی پسزمینه مراجعه کنید.
قطعه زیر نشان می دهد که چگونه می توان یک BroadcastReceiver
را تعریف کرد که زمانی که یک انتقال جغرافیایی رخ می دهد یک اعلان ارسال می کند. وقتی کاربر روی اعلان کلیک می کند، فعالیت اصلی برنامه ظاهر می شود:
کاتلین
class GeofenceBroadcastReceiver : BroadcastReceiver() { // ... override fun onReceive(context: Context?, intent: Intent?) { val geofencingEvent = GeofencingEvent.fromIntent(intent) if (geofencingEvent.hasError()) { val errorMessage = GeofenceStatusCodes .getStatusCodeString(geofencingEvent.errorCode) Log.e(TAG, errorMessage) return } // Get the transition type. val geofenceTransition = geofencingEvent.geofenceTransition // Test that the reported transition was of interest. if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER | geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { // Get the geofences that were triggered. A single event can trigger // multiple geofences. val triggeringGeofences = geofencingEvent.triggeringGeofences // Get the transition details as a String. val geofenceTransitionDetails = getGeofenceTransitionDetails( this, geofenceTransition, triggeringGeofences ) // Send notification and log the transition details. sendNotification(geofenceTransitionDetails) Log.i(TAG, geofenceTransitionDetails) } else { // Log the error. Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition)) } } }
جاوا
public class GeofenceBroadcastReceiver extends BroadcastReceiver { // ... protected void onReceive(Context context, Intent intent) { GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); if (geofencingEvent.hasError()) { String errorMessage = GeofenceStatusCodes .getStatusCodeString(geofencingEvent.getErrorCode()); Log.e(TAG, errorMessage); return; } // Get the transition type. int geofenceTransition = geofencingEvent.getGeofenceTransition(); // Test that the reported transition was of interest. if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { // Get the geofences that were triggered. A single event can trigger // multiple geofences. List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences(); // Get the transition details as a String. String geofenceTransitionDetails = getGeofenceTransitionDetails( this, geofenceTransition, triggeringGeofences ); // Send notification and log the transition details. sendNotification(geofenceTransitionDetails); Log.i(TAG, geofenceTransitionDetails); } else { // Log the error. Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition)); } } }
پس از شناسایی رویداد انتقال از طریق PendingIntent
، BroadcastReceiver
نوع انتقال geofence را دریافت میکند و آزمایش میکند که آیا این یکی از رویدادهایی است که برنامه برای راهاندازی اعلانها استفاده میکند -- GEOFENCE_TRANSITION_ENTER
یا GEOFENCE_TRANSITION_EXIT
در این مورد. سپس سرویس یک اعلان ارسال می کند و جزئیات انتقال را ثبت می کند.
نظارت بر ژئوفنس را متوقف کنید
توقف مانیتورینگ geofence زمانی که دیگر مورد نیاز یا دلخواه نیست می تواند به صرفه جویی در مصرف باتری و چرخه های CPU در دستگاه کمک کند. می توانید نظارت بر geofence را در فعالیت اصلی مورد استفاده برای افزودن و حذف geofences متوقف کنید. حذف geofence بلافاصله آن را متوقف می کند. API روش هایی را برای حذف geofence ها با شناسه های درخواست یا با حذف geofence های مرتبط با PendingIntent
ارائه می دهد.
قطعه زیر geofences را توسط PendingIntent
حذف میکند و تمام اعلانهای بعدی را هنگام ورود یا خروج دستگاه از geofenceهای اضافه شده قبلی متوقف میکند:
کاتلین
geofencingClient?.removeGeofences(geofencePendingIntent)?.run { addOnSuccessListener { // Geofences removed // ... } addOnFailureListener { // Failed to remove geofences // ... } }
جاوا
geofencingClient.removeGeofences(getGeofencePendingIntent()) .addOnSuccessListener(this, new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Geofences removed // ... } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Failed to remove geofences // ... } });
میتوانید geofencing را با سایر ویژگیهای آگاه از موقعیت مکانی، مانند بهروزرسانیهای دورهای مکان، ترکیب کنید. برای اطلاعات بیشتر، سایر دروس این کلاس را ببینید.
از بهترین شیوه ها برای ژئوفنسینگ استفاده کنید
در این بخش توصیه هایی برای استفاده از geofencing با API های مکان برای Android ارائه شده است.
مصرف برق را کاهش دهید
میتوانید از تکنیکهای زیر برای بهینهسازی مصرف انرژی در برنامههایی که از geofencing استفاده میکنند استفاده کنید:
میزان پاسخگویی اعلان را روی مقدار بالاتری تنظیم کنید. انجام این کار با افزایش تأخیر هشدارهای geofence، مصرف انرژی را بهبود می بخشد. به عنوان مثال، اگر مقدار پاسخگویی را پنج دقیقه تنظیم کنید، برنامه شما فقط هر پنج دقیقه یک بار هشدار ورود یا خروج را بررسی می کند. تنظیم مقادیر کمتر لزوماً به این معنی نیست که کاربران در آن بازه زمانی مطلع می شوند (به عنوان مثال، اگر مقداری را 5 ثانیه تنظیم کنید ممکن است دریافت هشدار کمی بیشتر از این مقدار طول بکشد).
از شعاع زمینفنس بزرگتر برای مکانهایی که کاربر زمان قابل توجهی را سپری میکند، مانند خانه یا محل کار، استفاده کنید. در حالی که شعاع بزرگتر مستقیماً مصرف برق را کاهش نمیدهد، فرکانس بررسی ورودی یا خروجی برنامه را کاهش میدهد و به طور موثر مصرف انرژی کلی را کاهش میدهد.
شعاع بهینه را برای ژئوفنس خود انتخاب کنید
برای بهترین نتایج، حداقل شعاع ژئوفنس باید بین 100 تا 150 متر تنظیم شود. وقتی Wi-Fi در دسترس است، دقت مکان معمولا بین 20 تا 50 متر است. هنگامی که مکان داخلی در دسترس باشد، محدوده دقت می تواند تا 5 متر باشد. فرض کنید که دقت مکان Wi-Fi حدود 50 متر است، مگر اینکه می دانید مکان داخلی در داخل geofence در دسترس است.
وقتی موقعیت مکانی Wi-Fi در دسترس نباشد (مثلاً وقتی در مناطق روستایی رانندگی میکنید)، دقت مکان کاهش مییابد. برد دقت می تواند از چند صد متر تا چند کیلومتر باشد. در مواردی مانند این، شما باید با استفاده از شعاع بزرگتر، ژئوفنس ایجاد کنید.
به کاربران توضیح دهید که چرا برنامه شما از geofence استفاده می کند
از آنجایی که برنامه شما هنگام استفاده از geofencing به موقعیت مکانی در پسزمینه دسترسی پیدا میکند، در نظر بگیرید که برنامه شما چگونه مزایایی را به کاربران ارائه میکند. به آنها توضیح دهید که چرا برنامه شما به این دسترسی برای افزایش درک و شفافیت کاربر نیاز دارد.
برای اطلاعات بیشتر در مورد بهترین شیوه های مربوط به دسترسی به موقعیت مکانی، از جمله geofencing، به صفحه بهترین شیوه های حریم خصوصی مراجعه کنید.
برای کاهش هرزنامه هشدار از نوع انتقال ساکن استفاده کنید
اگر هنگام رانندگی مختصر از کنار یک geofence تعداد زیادی هشدار دریافت می کنید، بهترین راه برای کاهش هشدارها استفاده از نوع انتقالی GEOFENCE_TRANSITION_DWELL
به جای GEOFENCE_TRANSITION_ENTER
است. به این ترتیب، هشدار سکونت تنها زمانی ارسال می شود که کاربر در یک دوره زمانی معین در داخل یک geofence توقف کند. شما می توانید مدت زمان را با تنظیم یک تاخیر پرسه زن انتخاب کنید.
فقط در صورت لزوم، geofences را دوباره ثبت کنید
geofence های ثبت شده در فرآیند com.google.process.location
متعلق به بسته com.google.android.gms
نگهداری می شوند. برنامه برای مدیریت رویدادهای زیر نیازی به انجام هیچ کاری ندارد، زیرا سیستم پس از این رویدادها geofences را بازیابی می کند:
- خدمات Google Play ارتقا یافته است.
- خدمات Google Play توسط سیستم به دلیل محدودیت منابع از بین می رود و دوباره راه اندازی می شود.
- فرآیند مکان یابی خراب می شود.
اگر پس از رویدادهای زیر همچنان به آنها نیاز دارید، برنامه باید مجدداً geofence ها را ثبت کند، زیرا در موارد زیر سیستم نمی تواند geofence ها را بازیابی کند:
- دستگاه راه اندازی مجدد می شود. برنامه باید به عملکرد کامل بوت دستگاه گوش دهد و سپس geofences مورد نیاز را دوباره ثبت کند.
- برنامه حذف و دوباره نصب می شود.
- داده های برنامه پاک می شود.
- اطلاعات خدمات Google Play پاک شده است.
- این برنامه یک هشدار
GEOFENCE_NOT_AVAILABLE
دریافت کرده است. این معمولاً پس از غیرفعال شدن NLP (ارائهدهنده مکان شبکه اندروید) اتفاق میافتد.
عیب یابی رویداد ورودی geofence
اگر هنگام ورود دستگاه به ژئوفنس، ژئوفنس ها فعال نمی شوند (هشدار GEOFENCE_TRANSITION_ENTER
فعال نمی شود)، ابتدا مطمئن شوید که ژئوفنس های شما به درستی همانطور که در این راهنما توضیح داده شده است، ثبت شده است.
در اینجا چند دلیل احتمالی وجود دارد که هشدارها همانطور که انتظار می رود کار نمی کنند:
- مکان دقیق در داخل geofence شما در دسترس نیست یا geofence شما بسیار کوچک است. در اکثر دستگاهها، سرویس geofence تنها از مکان شبکه برای راهاندازی geofence استفاده میکند. این سرویس از این رویکرد استفاده می کند زیرا مکان شبکه انرژی بسیار کمتری مصرف می کند، زمان کمتری برای بدست آوردن مکان های مجزا نیاز دارد و مهمتر از همه در داخل خانه در دسترس است.
Wi-Fi در دستگاه خاموش است. روشن بودن Wi-Fi می تواند دقت مکان را به میزان قابل توجهی بهبود بخشد، بنابراین اگر Wi-Fi خاموش باشد، برنامه شما ممکن است بسته به تنظیمات مختلف از جمله شعاع geofence، مدل دستگاه یا نسخه اندروید، هرگز هشدارهای geofence را دریافت نکند. با شروع از Android 4.3 (سطح API 18)، ما قابلیت "Wi-Fi scan only mode" را اضافه کردیم که به کاربران امکان می دهد Wi-Fi را غیرفعال کنند اما همچنان موقعیت شبکه خوبی داشته باشند. این تمرین خوبی است که از کاربر درخواست کنید و میانبری را برای کاربر فراهم کنید تا در صورت غیرفعال بودن هر دو حالت Wi-Fi یا Wi-Fi only scan را فعال کند. از SettingsClient استفاده کنید تا مطمئن شوید که تنظیمات سیستم دستگاه به درستی برای تشخیص موقعیت مکانی بهینه پیکربندی شده است.
توجه: اگر برنامه شما Android 10 (سطح API 29) یا بالاتر را هدف قرار میدهد، نمیتوانید مستقیماً با
WifiManager.setEnabled()
تماس بگیرید، مگر اینکه برنامه شما یک برنامه سیستم یا یک کنترلکننده خطمشی دستگاه (DPC) باشد. در عوض، از پانل تنظیمات استفاده کنید.- هیچ اتصال شبکه قابل اعتمادی در داخل geofence شما وجود ندارد. اگر اتصال داده قابل اعتمادی وجود نداشته باشد، ممکن است هشدار ایجاد نشود. این به این دلیل است که سرویس geofence به ارائه دهنده مکان شبکه بستگی دارد که به نوبه خود به اتصال داده نیاز دارد.
- هشدارها ممکن است دیر باشد. سرویس geofence به طور مداوم مکان را جستجو نمی کند، بنابراین در هنگام دریافت هشدارها انتظار کمی تأخیر را داشته باشید. معمولاً تأخیر کمتر از 2 دقیقه است، حتی زمانی که دستگاه در حال حرکت است کمتر. اگر محدودیتهای موقعیت مکانی پسزمینه اعمال شوند، تأخیر به طور متوسط حدود ۲ تا ۳ دقیقه است. اگر دستگاه برای مدت زمان قابل توجهی ثابت باشد، تاخیر ممکن است افزایش یابد (تا 6 دقیقه).
منابع اضافی
برای کسب اطلاعات بیشتر در مورد Geofencing، مواد زیر را مشاهده کنید:
نمونه ها
نمونه برنامه برای ایجاد و نظارت بر geofences.