קבלת מזהה פרסום שניתן לעדכון על ידי המשתמש חלק מ-Android Jetpack
כדי להגן על פרטיות המשתמשים, מומלץ שכל האפליקציות ל-Android יפעלו עם מזהים שניתנים לאיפוס על ידי המשתמש. אחד מהמזהים האלה הוא מזהה פרסום, שמזהה באופן ייחודי משתמש מסוים לתרחישי שימוש בפרסום, כמו התאמה אישית של מודעות.
כדי לתמוך בפתרון סטנדרטי למעקב אחרי מודעות במכשירים שבהם האפליקציה פועלת, אפשר להשתמש בספריית מזהה הפרסום. הספרייה הזו, שזמינה במכשירים עם Android 4.0 (רמת API 14) ומעלה, מגדירה ממשק לאינטראקציה עם ספקי מודעות ברמת המערכת. הממשק הזה מאפשר לאפליקציה לקבל ערכים עקביים של מזהה הפרסום.
ספק המודעות שנכלל בספרייה של מזהה הפרסום מגדיר גם כוונת תקן לפתיחת מסך הגדרות שהספק מטמיע. במסך ההגדרות הזה המשתמש יכול לאפס את מזהה הפרסום שלו ולבטל את ההסכמה להתאמה אישית של מודעות.
במדריך הזה מוסבר איך להשתמש במודול הלקוח של ספריית מזהה הפרסום כדי לקבל מזהה פרסום עקבי לכל משתמש במכשיר. בהמשך המדריך מופיעה סקירה כללית של ארכיטקטורת הספרייה.
הגדרת אפליקציית הלקוח
האינטראקציה עם מודול הלקוח של ספריית מזהה הפרסום מאפשרת לאפליקציה לאחזר מזהה פרסום עקבי שמייצג את המשתמש שמבצע אינטראקציה עם האפליקציה.
מזהה הפרסום מיוצג באמצעות גרסה 3 של פורמט המזהה הייחודי האוניברסלי (UUID) או פורמט מקביל של 128 ביט:
38400000-8cf0-11bd-b23e-10b96e40000d
ספריית מזהה הפרסום מבצעת נורמליזציה של הערך המוחזר לפי הצורך כדי לספק מזהים בפורמט הזה.
כדי לאחזר את מזהה הפרסום שניתן לאיפוס על ידי המשתמש באפליקציה שלכם, צריך לבצע את השלבים הבאים:
כדי לבדוק אם ספק מודעות זמין, מתקשרים למספר
AdvertisingIdClient.isAdvertisingIdProviderAvailable(). אם השיטה הזו מחזירהfalse, האפליקציה שלכם צריכה להשתמש באמצעי אחר כדי לבצע את כל התרחישים לדוגמה הנדרשים למעקב אחר מודעות.כדי לקבל את פרטי מזהה הפרסום, כולל מזהה הפרסום, צריך להתקשר אל
AdvertisingIdClient.getAdvertisingIdInfo(). ספריית מזהה הפרסום מפעילה את השיטה הזו בשרשור של עובד ומשתמשת בערך הזמן הקצוב לתפוגה של חיבור למשך 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") }
MyAdIdClient
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.
}
}
ארכיטקטורת ספריית מזהה הפרסום
איור 1 מציג את המבנה של ספריית מזהה הפרסום. הספרייה מורכבת מהמודולים הבאים:
- מודול לקוח, שהוא שכבה דקה שכלולה באפליקציות.
- מודול ספק, שיצרן המכשיר מספק. הטמעות של המודול הזה צריכות להגדיר ממשק משתמש להגדרות, כדי לאפשר למשתמשים לאפס את מזהה הפרסום שלהם ולשנות את ההעדפות שלהם לגבי מעקב אחר מודעות.
מודול הלקוח מתקשר עם מודול הספק כדי לאחזר מזהי פרסום והעדפות משתמשים לגבי מעקב אחר מודעות.
איך הספרייה מטפלת במספר ספקים
יכול להיות שמכשיר יתמוך בכמה ספקי מודעות ברמת המערכת בו-זמנית. אם ספריית מזהה הפרסום מזהה את המצב הזה, היא מוודאת שהאפליקציה תמיד מאחזרת מידע מאותו ספק, בהנחה שהספק ממשיך להיות זמין. התהליך הזה שומר על עקביות מזהה הפרסום.
אם קבוצת ספקי המודעות הזמינים משתנה לאורך זמן והאפליקציה שלכם מתקשרת עם ספק מזהי פרסום אחר, כל שאר אפליקציות הלקוח מתחילות להשתמש גם בספק החדש הזה. האפליקציה שלך מפגינה את אותה התנהגות שהייתה מתרחשת אם המשתמש היה מבקש לאפס את מזהה הפרסום שלו.
ספריית ספקי מזהי הפרסום משתמשת בסדר הדטרמיניסטי הבא כדי לדרג את הספקים:
- ספקים שביקשו את ההרשאה
androidx.ads.identifier.provider.HIGH_PRIORITY. - ספקים שהותקנו במכשיר למשך הזמן הארוך ביותר.
- ספקים שמופיעים ראשונים בסדר אלפביתי.