יצירת גבולות וירטואליים ומעקב אחריהם

גבולות וירטואליים משלבים את המוּדעוּת למיקום הנוכחי של המשתמש עם מודעות קירבה למיקומים שעשויים לעניין אותך. כדי לסמן את המיקום הרצוי, אתה מציין את קו הרוחב וקו האורך. כדי לשנות את טווח הקרבה של המיקום, מוסיפים רדיוס. קו הרוחב, קו האורך והרדיוס מגדירים גבולות וירטואליים, שטח מעגלי, או גדר, מסביב למיקום הרלוונטי.

אפשר להגדיר כמה אזורי הגנה פעילים, עם מגבלה של 100 אזורים לכל אפליקציה לכל משתמש במכשיר. בכל פעם בגבולות וירטואליים, תוכלו לבקש משירותי המיקום לשלוח לכם אירועי כניסה ויציאה. לחלופין, תוכלו להגדיר משך זמן בתוך אזור הגבול הווירטואלי שצריך להמתין, או לשהות, לפני הפעלת אירוע. שלך יכול להגביל את משך הזמן של כל גבולות וירטואליים על ידי ציון משך תפוגה באלפיות השנייה. אחרי שתוקף הגדרת הגיאופנז יפוג, שירותי המיקום יסירו אותו באופן אוטומטי.

בשיעור הזה נסביר איך להוסיף ולהסיר גבולות וירטואליים, ולאחר מכן להאזין למעברים בגבולות וירטואליים באמצעות BroadcastReceiver.

הערה: במכשירי Wear, ממשקי ה-API של Geofencing לא משתמשים ביעילות חשמל. אנחנו לא ממליצים להשתמש בממשקי ה-API האלה ב-Wear. מידע נוסף זמין במאמר חיסכון בחשמל ובסוללה.

הגדרה של מעקב אחרי מתחם מוגדר

השלב הראשון בבקשת מעקב אחרי גבולות וירטואליים הוא לבקש הרשאות. כדי להשתמש בגבולות וירטואליים, האפליקציה צריכה לבקש את הפרטים הבאים:

אפשר לקרוא מידע נוסף במדריך לבקש הרשאות מיקום.

אם רוצים להשתמש ב-BroadcastReceiver כדי להאזין למעברים במתחם הגיאוגרפית, צריך להוסיף רכיב שמציין את שם השירות. הרכיב הזה חייב להיות צאצא של הרכיב <application>:

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

כדי לגשת לממשקי ה-API של המיקום, צריך ליצור מופע של לקוח עם גבולות וירטואליים. כך מחברים את הלקוח:

KotlinJava
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);
}

יצירה והוספה של גבולות וירטואליים

האפליקציה צריכה ליצור ולהוסיף אזורי הגנה גיאוגרפיים באמצעות סוג ה-builder של ממשק ה-API למיקום, ליצירת אובייקטים של אזורי הגנה גיאוגרפיים, וסוג ה-convenience להוספת אותם. כמו כן, כדי לטפל את הכוונות שנשלחות משירותי המיקום כאשר מתרחשים מעברים בין גבולות וירטואליים, אפשר להגדיר PendingIntent, כמו שמוצג בקטע הזה.

הערה: במכשירים עם משתמש יחיד, המגבלה היא 100 אזורי הגנה גיאוגרפיים לכל אפליקציה. במכשירים עם כמה משתמשים, המגבלה היא 100 אזורי הגנה גיאוגרפיים לכל אפליקציה לכל משתמש במכשיר.

יצירת אובייקטים בגבולות וירטואליים

קודם צריך להשתמש ב- Geofence.Builder כדי ליצור גדר גיאוגרפי, ולהגדיר את הרדיוס, משך הזמן וסוגי המעבר הרצויים לגדר הגיאוגרפי. לדוגמה, כדי לאכלס אובייקט רשימה:

KotlinJava
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());

בדוגמה הזו המערכת שולפת נתונים מקובץ קבועים. בפועל, אפליקציות עשויות יצירת גבולות וירטואליים באופן דינמי על סמך המיקום של המשתמש.

ציון גבולות וירטואליים וטריגרים ראשוניים

קטע הקוד הבא משתמש בכיתה GeofencingRequest ובכיתה המשולבת GeofencingRequestBuilder כדי לציין את אזורי הגיאופנז לניטור ולהגדיר את האופן שבו אירועים קשורים של אזורי גיאופנז מופעלים:

KotlinJava
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_TRANSITION_ENTER מופעל כשמכשיר נכנס למתחם גיאוגרפית, והמעבר GEOFENCE_TRANSITION_EXIT מופעל כשמכשיר יוצא מתחום גיאוגרפית. ציון הערך INITIAL_TRIGGER_ENTER מורה לשירותי המיקום להפעיל את GEOFENCE_TRANSITION_ENTER אם המכשיר כבר נמצא בתוך הגדרת הגבול הגיאוגרפית.

במקרים רבים, עדיף להשתמש במקום זאת ב- INITIAL_TRIGGER_DWELL, שמפעיל אירועים רק כאשר המשתמש עוצר למשך פרק זמן מוגדר בתוך גדר גיאוגרפית. הגישה הזו יכולה לעזור לצמצם את מספר ההתראות שמתקבלות כשמכשיר נכנס לתחום של גדר וירטואלית ויוצא ממנו תוך זמן קצר. אסטרטגיה נוספת לקבלת התוצאות הטובות ביותר הגדרת גבולות וירטואליים היא רדיוס מינימלי של 100 מטר. כך אפשר להביא בחשבון את רמת הדיוק של המיקום ברשתות Wi-Fi רגילות, וגם לצמצם את צריכת החשמל של המכשיר.

הגדרת מקלט שידורים למעברי גבולות וירטואליים

Intent שנשלח משירותי המיקום יכול להפעיל פעולות שונות באפליקציה שלך, אבל אסור להתחיל בה פעילות או מקטע, כי רכיבים צריך להפוך לגלוי רק בתגובה לפעולת משתמש. במקרים רבים, BroadcastReceiver היא דרך טובה לטפל במעבר של גדר גיאוגרפית. BroadcastReceiver מקבל עדכונים כשמתרחש אירוע, למשל מעבר לתחום של גדר וירטואלית או מחוץ לתחום שלה, ויכול להתחיל משימות ממושכות ברקע.

בקטע הקוד הבא מוסבר איך כדי להגדיר PendingIntent שמתחיל ב-BroadcastReceiver:

KotlinJava
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;
    }

הוספת גבולות וירטואליים

כדי להוסיף אזורי הגנה גיאוגרפיים, משתמשים בשיטה GeofencingClient.addGeofences(). מציינים את האובייקט GeofencingRequest ואת PendingIntent. קטע הקוד הבא מדגים את עיבוד התוצאות:

KotlinJava
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
                // ...
            }
        });

טיפול במעברים מתחום הגדרה גיאוגרפית

כאשר שירותי המיקום מזהים שהמשתמש נכנס לגבולות וירטואליים או יצא מהם, הם שולחת את ה-Intent שכלולה ב-PendingIntent שכללת בבקשה להוספת גבולות וירטואליים. מקלט שידור כמו GeofenceBroadcastReceiver מבחין שה-Intent הופעל, ואז יכול לקבל את האירוע של הגדרת גבולות הווירטואליים מהכוונה (intent), לקבוע את סוג המעבר בגבול הווירטואלי ולזהות איזה מבין גבולות הווירטואליים שהוגדרו הופעל. השידור המקבל יכול להנחות את האפליקציה להתחיל לבצע עבודה ברקע, או אם רצוי לשלוח התראה כפלט.

הערה: ב-Android 8.0 (רמת API 26) ואילך, אם אפליקציה פועלת ברקע בזמן מעקב אחרי גדר וירטואלית, המכשיר מגיב לאירועים של גדר וירטואלית כל כמה דקות. במאמר מגבלות על מיקום ברקע מוסבר איך להתאים את האפליקציה למגבלות התגובה האלה.

קטע הקוד הבא מראה איך מגדירים BroadcastReceiver שמפרסם התראה כשמתרחש מעבר במסגרת הגדרת הגיאופנז. כשהמשתמש ילחץ על ההתראה, הפעילות העיקרית של האפליקציה תופיע:

KotlinJava
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_TRANSITION_ENTER או GEOFENCE_TRANSITION_EXIT. לאחר מכן, השירות שולח התראה ומתעדות את פרטי המעבר ביומן.

הפסקת המעקב אחרי מתחם הגיאופוליגרפי

הפסקת המעקב אחר גבולות וירטואליים כשאין בו יותר צורך או באופן רצוי יכולה לעזור לחסוך בסוללה של המעבד (CPU) ושל מחזורי המעבד (CPU) במכשיר. אפשר להפסיק את המעקב אחרי גבולות וירטואליים בפעילות העיקרית שמשמשת להוספה ולהסרה של גבולות וירטואליים. הסרת גבולות וירטואליים גורמת להפסקה באופן מיידי. ה-API מספק שיטות להסרת אזורי הגנה על סמך מזהי בקשות, או להסרת אזורי הגנה שמשויכים ל-PendingIntent נתון.

קטע הקוד הבא מסיר אזורי הגנה על ידי PendingIntent, ומפסיק את כל ההתראות הנוספות כשהמכשיר נכנס או יוצא מאזורי הגנה שנוספו בעבר:

KotlinJava
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 עם ממשקי ה-API למיקום ב-Android.

הפחתה של צריכת האנרגיה

אתם יכולים להשתמש בשיטות הבאות כדי לבצע אופטימיזציה של צריכת החשמל באפליקציות שמשתמשות בתיוג גיאוגרפי:

  • מגדירים ערך גבוה יותר לרגישות להתראות. כך תשפר את צריכת החשמל קיצור זמן האחזור של ההתראות על גבולות וירטואליים. לדוגמה, אם מגדירים ערך רספונסיביות של חמש דקות האפליקציה בודקת אם יש התראה על כניסה או יציאה רק פעם אחת בכל חמש דקות. הגדרת ערכים נמוכים יותר לא בהכרח אומרת שהמשתמשים יקבלו התראה במהלך פרק הזמן הזה (לדוגמה, אם מגדירים ערך של 5 שניות, יכול להיות שיחלפו כמה שניות נוספות עד שההתראה תישלח).

  • מומלץ להגדיר רדיוס גדול יותר לגבולות וירטואליים במיקומים שבהם המשתמש מבלה הרבה זמן. כמו בית או עבודה. רדיוס גדול יותר לא מפחית את צריכת החשמל באופן ישיר, אבל התדירות שבה האפליקציה בודקת כניסה או יציאה, וכתוצאה מכך מפחיתה ביעילות את רמת החשמל צריכה.

בחירת הרדיוס האופטימלי למתחם הגיאוגרפית

כדי לקבל את התוצאות הטובות ביותר, כדאי להגדיר את הרדיוס המינימלי של הגדרת הגבול הגיאוגרפי בין 100 ל-150 מטר. כשחיבור ה-Wi-Fi זמין, הדיוק של המיקום הוא בדרך כלל בין 20 ל-50 מטרים. כשנמצאים בפנים אם המיקום זמין, טווח הדיוק יכול להיות עד 5 מטרים. אלא אם אין לך ידע בפנים זמין בתוך הגבול הווירטואלי, נניח שרמת הדיוק של מיקום Wi-Fi היא 50 מטרים.

כשהמיקום לפי Wi-Fi לא זמין (למשל, כשאתם נוהגים באזורים כפריים), דיוק המיקום יורד. טווח הדיוק יכול לנוע בין כמה מאות מטרים לכמה קילומטרים. במקרים כאלה, כדאי ליצור אזורי הגנה גיאוגרפיים עם רדיוס גדול יותר.

הסבר למשתמשים למה האפליקציה שלכם משתמשת בתיוג גיאוגרפי

כשמשתמשים בגבולות וירטואליים, האפליקציה ניגשת למיקום ברקע. כדאי לחשוב על האופן שבו האפליקציה מספקת יתרונות למשתמשים. כדי לשפר את השקיפות ואת ההבנה של המשתמשים, חשוב להסביר להם בצורה ברורה למה לאפליקציה שלכם נדרשת הגישה הזו.

כדי לקבל מידע נוסף על שיטות מומלצות שקשורות לגישה למיקום, כולל גבולות וירטואליים, ראו את הפרטיות הטובה ביותר שיטות.

שימוש בסוג המעבר 'תושבות' כדי להפחית את ההתראות על ספאם

אם אתם מקבלים מספר רב של התראות כשאתם חולפים קצרה על פני גדר וירטואלית, הדרך הטובה ביותר לצמצם את מספר ההתראות היא להשתמש בסוג המעבר GEOFENCE_TRANSITION_DWELL במקום GEOFENCE_TRANSITION_ENTER. כך, ההתראה על מיקום המגורים תישלח רק כשהמשתמש יעצור בתוך גדר גיאוגרפית למשך פרק זמן מסוים. אתם יכולים לבחור את משך הזמן על ידי הגדרת השהיה של זמן המתנה.

רישום מחדש של גבולות וירטואליים רק בעת הצורך

אזורי הגדרה גיאוגרפיים רשומים נשמרים בתהליך com.google.process.location שבבעלות החבילה com.google.android.gms. האפליקציה לא צריכה לעשות שום דבר כדי לטפל באירועים הבאים, כי המערכת משחזרת את המחיצות הגיאוגרפיות אחרי האירועים האלה:

  • שירותי Google Play שודרגו.
  • המערכת מפסיקה את Google Play Services ומפעילה אותו מחדש בגלל הגבלת משאבים.
  • תהליך המיקום קורס.

האפליקציה צריכה לרשום מחדש את הגבולות הגיאוגרפיים אם הם עדיין נדרשים אחרי האירועים הבאים, כי המערכת לא יכולה לשחזר את הגבולות הווירטואליים במקרים הבאים:

  • המכשיר מופעל מחדש. האפליקציה אמורה להמתין לפעולה של סיום האתחול של המכשיר, ואז לרשום מחדש את אזורי הגיאופנצ'ר הנדרשים.
  • האפליקציה תוסר ותתקן מחדש.
  • הנתונים של האפליקציה יימחקו.
  • הנתונים של Google Play Services יימחקו.
  • האפליקציה קיבלה GEOFENCE_NOT_AVAILABLE התראה. בדרך כלל זה קורה אחרי השבתת NLP (ספק המיקום ברשת של Android).

פתרון בעיות באירוע הכניסה לגבול הווירטואלי

אם גבולות וירטואליים לא מופעלים כשהמכשיר נכנס לגבולות וירטואליים (ההתראה GEOFENCE_TRANSITION_ENTER לא מופעלת), צריך קודם לוודא שהגבולות וירטואליים רשומים כמו שצריך כפי שמתואר במדריך הזה.

הנה כמה סיבות אפשריות לכך שהתראות לא פועלות כמצופה:

  • המיקום המדויק לא זמין בתוך הגדרת הגיאופנז או שהיא קטנה מדי. ברוב המכשירים, שירות הגדרת ההיקף משתמש רק במיקום הרשת כדי להפעיל את ההיקף. השירות משתמש בגישה הזו כי המיקום ברשת צורך הרבה פחות לחשמל, נדרש פחות זמן להגיע למיקומים נפרדים, והכי חשוב, הוא זמין בתוך מבנים.
  • ה-Wi-Fi כבוי במכשיר. הפעלת ה-Wi-Fi יכולה לשפר באופן משמעותי את דיוק המיקום, כך שאם ה-Wi-Fi כבוי, יכול להיות שהאפליקציה לא תקבל אף פעם התראות לגבי גדר גיאוגרפית, בהתאם למספר הגדרות, כולל רדיוס הגדר הגיאוגרפית, דגם המכשיר או גרסת Android. החל מגרסה 4.3 של Android‏ (רמת API 18), הוספנו את היכולת 'מצב סריקת Wi-Fi בלבד', שמאפשרת למשתמשים להשבית את ה-Wi-Fi ועדיין לקבל מיקום רשת טוב. מומלץ להציג למשתמש הודעה ולספק לו קיצור דרך להפעלת ה-Wi-Fi או מצב סריקת Wi-Fi בלבד, אם שניהם מושבתים. שימוש ב- הגדרות לקוח כדי לוודא שהגדרות המערכת של המכשיר מוגדרות כראוי להשגת אופטימלי זיהוי המיקום.

    הערה: אם האפליקציה מטרגטת את Android 10 (רמת API 29) או גבוה יותר, אין אפשרות להתקשר ישירות ל-WifiManager.setEnabled(), אלא אם האפליקציה שלך היא אפליקציית מערכת או מדיניות מכשיר שלט רחוק (DPC). במקום זאת, השתמשו חלונית ההגדרות.

  • אין קישוריות רשת אמינה בתוך הגבול הווירטואלי. אם יש אין חיבור נתונים אמין, ייתכן שלא ייווצרו התראות. הסיבה לכך היא ששירות הגדרת ההיקף נקבע לפי ספק המיקום ברשת, שדורש חיבור נתונים.
  • יכול להיות עיכוב בקבלת ההתראות. שירות הגבולות הווירטואליים לא שולח שאילתות באופן רציף לגבי ולכן יש לצפות לזמן אחזור בעת קבלת התראות. בדרך כלל זמן האחזור הוא פחות משתי דקות, ועוד פחות כשהמכשיר בתנועה. אם המיקום רקע מגבלות המיקומים בתוקף, זמן האחזור הוא 2-3 דקות בממוצע. אם המכשיר היה נייח במשך פרק זמן משמעותי, זמן האחזור עשוי להתארך (עד 6 דקות).

מקורות מידע נוספים

למידע נוסף על גיאופיינס, אפשר לעיין במאמרים הבאים:

דוגמיות

אפליקציה לדוגמה ליצירה של גבולות וירטואליים ולמעקב אחריהם.