קבלת מזהה פרסום שניתן לאיפוס על ידי המשתמש חלק מ-Android Jetpack.

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

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

ספק המודעות שכלול בספריית מזהי הפרסום מגדיר גם Intent רגיל לפתיחת מסך הגדרות שספק המודעות מטמיע. מסך ההגדרות הזה מאפשר למשתמש לאפס את מזהה הפרסום שלו ולבטל את ההסכמה להתאמה אישית של המודעות.

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

הגדרה של אפליקציית הלקוח

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

מזהה הפרסום מיוצג באמצעות גרסה 3 של מזהה הפרסום ייחודי מזהה (UUID) פורמט או הפורמט המקביל של 128 ביט:

38400000-8cf0-11bd-b23e-10b96e40000d

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

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

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

  2. כדי לקבל את הפרטים של מזהה המודעה, כולל מזהה הפרסום, צריך להתקשר AdvertisingIdClient.getAdvertisingIdInfo() ספריית Advertising ID מבצעת את השיטה הזו בשרשור עבודה, ומשתמשת בזמן קצוב לתפוגה של 10 שניות לחיבור.

קטע הקוד הבא מראה איך לאחזר את מזהה הפרסום ומידע אחר מספק המודעות:

app/build.gradle

Groovy

dependencies {
    implementation 'androidx.ads:ads-identifier:1.0.0-alpha01'

    // Used for the calls to addCallback() in the snippets on this page.
    implementation 'com.google.guava:guava:28.0-android'
}

Kotlin

dependencies {
    implementation("androidx.ads:ads-identifier:1.0.0-alpha01")

    // Used for the calls to addCallback() in the snippets on this page.
    implementation("com.google.guava:guava:28.0-android")
}

לקוח AdIdClient שלי

Kotlin

// Used for the call to addCallback() within this snippet.
import com.google.common.util.concurrent.Futures.addCallback

private fun determineAdvertisingInfo() {
    if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
        val advertisingIdInfoListenableFuture =
                AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)

        addCallback(advertisingIdInfoListenableFuture,
                object : FutureCallback<AdvertisingIdInfo> {
            override fun onSuccess(adInfo: AdvertisingIdInfo?) {
                val id: String = adInfo?.id
                val providerPackageName: String = adInfo?.providerPackageName
                val isLimitTrackingEnabled: Boolean =
                                adInfo?.isLimitTrackingEnabled
            }

            // Any exceptions thrown by getAdvertisingIdInfo()
            // cause this method to be called.
            override fun onFailure(t: Throwable) {
                Log.e("MY_APP_TAG",
                        "Failed to connect to Advertising ID provider.")
                // Try to connect to the Advertising ID provider again or fall
                // back to an ad solution that doesn't require using the
                // Advertising ID library.
            }
        }, Executors.newSingleThreadExecutor())
    } else {
        // The Advertising ID client library is unavailable. Use a different
        // library to perform any required ad use cases.
    }
}

Java

// Used for the call to addCallback() within this snippet.
import com.google.common.util.concurrent.Futures;

private void determineAdvertisingInfo() {
    if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
        ListenableFuture<AdvertisingIdInfo> advertisingIdInfoListenableFuture =
                AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
        Futures.addCallback(advertisingIdInfoListenableFuture,
                new FutureCallback<AdvertisingIdInfo>() {
                    @Override
                    public void onSuccess(AdvertisingIdInfo adInfo) {
                        String id = adInfo.getId();
                        String providerPackageName =
                                adInfo.getProviderPackageName();
                        boolean isLimitTrackingEnabled =
                                adInfo.isLimitTrackingEnabled();

                    // Any exceptions thrown by getAdvertisingIdInfo()
                    // cause this method to be called.
                    @Override
                    public void onFailure(Throwable throwable) {
                        Log.e("MY_APP_TAG",
                                "Failed to connect to Advertising ID provider.");
                        // Try to connect to the Advertising ID provider again
                        // or fall back to an ad solution that doesn't require
                        // using the Advertising ID library.
                    }
                });
    } else {
        // The Advertising ID client library is unavailable. Use a different
        // library to perform any required ad use cases.
    }
}

הארכיטקטורה של ספריית Advertising ID

תרשים הארכיטקטורה
איור 1. הארכיטקטורה של ספריית מזהי הפרסום

איור 1 מציג את המבנה של ספריית מזהי הפרסום. הספרייה מורכבת מהמודולים הבאים:

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

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

איך הספרייה מטפלת במספר ספקים

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

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

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

  1. ספקים שביקשו את ההרשאה androidx.ads.identifier.provider.HIGH_PRIORITY.
  2. ספקים שהותקנו במכשיר הכי הרבה זמן.
  3. ספקים שמופיעים ראשונים בסדר אלפביתי.