همانطور که در اسناد Android Sandbox Privacy می خوانید، از دکمه Developer Preview یا Beta برای انتخاب نسخه برنامه ای که با آن کار می کنید استفاده کنید، زیرا ممکن است دستورالعمل ها متفاوت باشد.
API مخاطب محافظت شده در Android (که قبلاً به عنوان FLEDGE شناخته می شد) شامل API مخاطبان سفارشی و API انتخاب آگهی است. پلتفرمهای فناوری تبلیغات و تبلیغکنندگان میتوانند از این APIها برای ارائه آگهیهای سفارشیشده براساس تعامل قبلی با برنامه استفاده کنند که اشتراکگذاری شناسهها را در بین برنامهها محدود میکند و اشتراکگذاری اطلاعات تعامل برنامه کاربر را با اشخاص ثالث محدود میکند.
Custom Audience API حول انتزاع "مخاطب سفارشی" متمرکز شده است که نشان دهنده گروهی از کاربران با اهداف مشترک است. یک تبلیغکننده میتواند کاربری را با یک مخاطب سفارشی ثبت کند و تبلیغات مرتبط را با آن مرتبط کند. این اطلاعات به صورت محلی ذخیره میشوند و میتوانند برای اطلاعرسانی به مناقصههای آگهیدهنده، فیلتر کردن آگهیها و ارائه آگهی استفاده شوند.
Ad Selection API چارچوبی را ارائه می دهد که به چندین برنامه نویس اجازه می دهد یک حراج را به صورت محلی برای مخاطبان سفارشی اجرا کنند. برای دستیابی به این هدف، سیستم تبلیغات مرتبط مرتبط با مخاطبان سفارشی را در نظر میگیرد و پردازش بیشتری را روی تبلیغاتی انجام میدهد که یک پلتفرم فناوری تبلیغات به دستگاه برمیگرداند.
پلتفرمهای فناوری تبلیغات میتوانند این APIها را برای پیادهسازی بازاریابی مجدد که حریم خصوصی کاربر را حفظ میکند، ادغام کنند. پشتیبانی از موارد استفاده اضافی، از جمله تبلیغات نصب برنامه، برای نسخه های بعدی برنامه ریزی شده است. در طرح پیشنهادی، درباره API مخاطب محافظت شده در Android بیشتر بیاموزید.
این راهنما نحوه کار با Protected Audience API در Android را برای انجام کارهای زیر شرح می دهد:
قبل از شروع
قبل از شروع، موارد زیر را کامل کنید:
- محیط توسعه خود را برای Privacy Sandbox در Android تنظیم کنید .
- یا یک تصویر سیستم را روی یک دستگاه پشتیبانی شده نصب کنید یا یک شبیهساز راهاندازی کنید که شامل پشتیبانی از Privacy Sandbox در Android باشد.
در ترمینال، با دستور adb زیر، دسترسی به API مخاطبان محافظت شده (به طور پیش فرض غیرفعال) را فعال کنید .
adb shell device_config put adservices ppapi_app_allow_list \"*\"
یک مجوز
ACCESS_ADSERVICES_CUSTOM_AUDIENCE
را در مانیفست برنامه خود قرار دهید:<uses-permission android:name="android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE" />
به پیکربندی سرویس های تبلیغاتی در عنصر
<application>
مانیفست خود ارجاع دهید:<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />
منبع XML خدمات تبلیغاتی را که در مانیفست خود ارجاع داده شده است، مانند
res/xml/ad_services_config.xml
مشخص کنید. درباره مجوزهای خدمات تبلیغات و کنترل دسترسی SDK بیشتر بیاموزید .<ad-services-config> <custom-audiences allowAllToAccess="true" /> </ad-services-config>
بهطور پیشفرض، Ad Selection API محدودیتهایی را برای حداکثر مقدار حافظهای که یک حراج یا اسکریپت گزارشدهی نمایش میتواند اختصاص دهد اعمال میکند. ویژگی محدودیت حافظه به WebView نسخه 105.0.5195.58 یا بالاتر نیاز دارد. این پلتفرم یک بررسی نسخه را اعمال میکند و در صورت عدم رضایت، تماسهای مربوط به
selectAds
و APIهایreportImpression
با شکست مواجه میشوند. دو گزینه برای تنظیم این وجود دارد:گزینه 1: دستور adb زیر را برای غیرفعال کردن این چک اجرا کنید:
adb device_config put fledge_js_isolate_enforce_max_heap_size false
گزینه 2: WebView Beta را از فروشگاه Google Play نصب کنید. این باید برابر یا بالاتر از نسخه ذکر شده قبلی باشد.
به یک مخاطب سفارشی بپیوندید
یک مخاطب سفارشی نشان دهنده گروهی از کاربران با اهداف یا علایق مشترک است که توسط یک برنامه تبلیغ کننده تصمیم می گیرد. یک برنامه یا SDK ممکن است از یک مخاطب سفارشی برای نشان دادن یک مخاطب خاص استفاده کند، مانند شخصی که مواردی را در سبد خرید گذاشته است. برای ایجاد یا پیوستن به یک مخاطب سفارشی به صورت ناهمزمان، موارد زیر را انجام دهید:
- شی
CustomAudienceManager
را راه اندازی کنید. - با تعیین پارامترهای کلیدی مانند بسته خریدار و نام مرتبط، یک شی
CustomAudience
ایجاد کنید. سپس، شیJoinCustomAudienceRequest
را با شیCustomAudience
مقداردهی اولیه کنید. -
joinCustomAudience()
ناهمزمان را با شیJoinCustomAudienceRequest
و اشیاءExecutor
وOutcomeReceiver
مربوطه فراخوانی کنید.
کاتلین
val customAudienceManager: CustomAudienceManager =
context.getSystemService(CustomAudienceManager::class.java)
// Initialize a custom audience.
val audience = CustomAudience.Builder()
.setBuyer(buyer)
.setName(name)
...
.build()
// Initialize a custom audience request.
val joinCustomAudienceRequest: JoinCustomAudienceRequest =
JoinCustomAudienceRequest.Builder().setCustomAudience(audience).build()
// Request to join a custom audience.
customAudienceManager.joinCustomAudience(joinCustomAudienceRequest,
executor,
outcomeReceiver)
جاوا
CustomAudienceManager customAudienceManager =
context.getSystemService(CustomAudienceManager.class);
// Initialize a custom audience.
CustomAudience audience = new CustomAudience.Builder()
.setBuyer(buyer)
.setName(name)
...
.build();
// Initialize a custom audience request.
JoinCustomAudienceRequest joinCustomAudienceRequest =
new JoinCustomAudienceRequest.Builder().setCustomAudience(audience).build();
// Request to join a custom audience.
customAudienceManager.joinCustomAudience(joinCustomAudienceRequest,
executor,
outcomeReceiver);
ترکیبی از پارامترهای زیر به طور منحصر به فرد هر شیء CustomAudience
را در یک دستگاه شناسایی می کند:
-
owner
: نام بسته برنامه مالک. این به طور ضمنی روی نام بسته برنامه تماس گیرنده تنظیم شده است. -
buyer
: شناسه شبکه تبلیغات خریدار که تبلیغات را برای این مخاطبان سفارشی مدیریت می کند. -
name
: نام یا شناسه دلخواه برای مخاطبان سفارشی.
فراخوانی مکرر joinCustomAudience()
با نمونهای متفاوت از CustomAudience
، هر CustomAudience
موجود را با پارامترهای owner, buyer
و name
منطبق بهروزرسانی میکند. برای کمک به حفظ حریم خصوصی، نتیجه API بین «ایجاد» و «بهروزرسانی» تمایز قائل نمیشود.
علاوه بر این، CustomAudience
باید با این پارامترهای مورد نیاز ایجاد شود:
- URL بهروزرسانی روزانه : یک نشانی وب HTTPS که هر روز در پسزمینه جستجو میشود تا سیگنالهای پیشنهادی کاربر مخاطب سفارشی، دادههای مناقصه مورد اعتماد را بهروزرسانی کند، و نشانیهای وب و ابردادهها را برای تبلیغات نمایش دهد.
- URL منطقی مناقصه : یک نشانی اینترنتی HTTPS که در حین انتخاب آگهی برای واکشی منطق پیشنهادی جاوا اسکریپت خریدار درخواست شده است. امضاهای تابع مورد نیاز را در این جاوا اسکریپت مشاهده کنید.
- شناسههای رندر آگهی : یک شناسه دلخواه که توسط فناوری آگهی خریدار تنظیم میشود. این یک بهینه سازی برای تولید محموله برای B&A است.
پارامترهای اختیاری برای یک شی CustomAudience
ممکن است شامل موارد زیر باشد:
- زمان فعالسازی : مخاطبان سفارشی فقط میتوانند پس از زمان فعالسازی در انتخاب آگهی و بهروزرسانیهای روزانه شرکت کنند. به عنوان مثال، این می تواند برای جذب کاربران از کار افتاده یک برنامه مفید باشد.
- زمان انقضا : زمان آینده که پس از آن مخاطبان سفارشی از دستگاه حذف میشوند.
- سیگنالهای مناقصه کاربر : یک رشته JSON حاوی سیگنالهای کاربر، مانند منطقه محلی ترجیحی کاربر، که جاوا اسکریپت منطق پیشنهاد خریدار برای تولید پیشنهادها در طول فرآیند انتخاب آگهی مصرف میکند. این فرمت به پلتفرمهای فناوری تبلیغات کمک میکند تا از کد در سراسر پلتفرمها استفاده مجدد کنند و مصرف در توابع جاوا اسکریپت را کاهش میدهد.
- دادههای مناقصه مورد اعتماد : یک نشانی اینترنتی HTTPS و فهرستی از رشتههای مورد استفاده در فرآیند انتخاب آگهی که سیگنالهای پیشنهاد قیمت را از یک سرویس کلید/مقدار قابل اعتماد دریافت میکنند.
- تبلیغات : فهرستی از اشیاء
AdData
مربوط به تبلیغاتی که در انتخاب آگهی شرکت می کنند. هر شیءAdData
شامل موارد زیر است:- Render URL : یک نشانی اینترنتی HTTPS که برای نمایش آگهی نهایی درخواست می شود.
- فراداده : یک شی JSON که به صورت رشته ای حاوی اطلاعاتی است که باید توسط منطق پیشنهاد خریدار در طول فرآیند انتخاب آگهی مصرف شود.
- فیلترهای تبلیغات : کلاسی که شامل تمام اطلاعات لازم برای فیلتر کردن آگهی نصب برنامه و محدودیت فرکانس در هنگام انتخاب آگهی است.
در اینجا یک مثال از یک نمونه شئ CustomAudience
آورده شده است:
کاتلین
// Minimal initialization of a CustomAudience object
val customAudience: CustomAudience = CustomAudience.Builder()
.setBuyer(AdTechIdentifier.fromString("my.buyer.domain.name"))
.setName("example-custom-audience-name")
.setDailyUpdateUrl(Uri.parse("https://DAILY_UPDATE_URL"))
.setBiddingLogicUrl(Uri.parse("https://BIDDING_LOGIC_URL"))
.build()
جاوا
// Minimal initialization of a CustomAudience object
CustomAudience customAudience = CustomAudience.Builder()
.setBuyer(AdTechIdentifier.fromString("my.buyer.domain.name"))
.setName("example-custom-audience-name")
.setDailyUpdateUrl(Uri.parse("https://DAILY_UPDATE_URL"))
.setBiddingLogicUrl(Uri.parse("https://BIDDING_LOGIC_URL"))
.build();
نتایج joinCustomAudience() را مدیریت کنید
متد joinCustomAudience()
ناهمزمان از شی OutcomeReceiver
برای سیگنال دادن به نتیجه فراخوانی API استفاده می کند.
- فراخوانی
onResult()
نشان میدهد که مخاطب سفارشی با موفقیت ایجاد یا بهروزرسانی شده است. - فراخوانی
onError()
onError دو شرط ممکن را نشان می دهد.- اگر
JoinCustomAudienceRequest
با آرگومان های نامعتبر مقداردهی اولیه شود،AdServicesException
یکIllegalArgumentException
را به عنوان علت نشان می دهد. - همه خطاهای دیگر
AdServicesException
با یکIllegalStateException
به عنوان علت دریافت می کنند.
- اگر
در اینجا نمونه ای از مدیریت نتیجه joinCustomAudience()
آورده شده است:
کاتلین
var callback: OutcomeReceiver<Void, AdServicesException> =
object : OutcomeReceiver<Void, AdServicesException> {
override fun onResult(result: Void) {
Log.i("CustomAudience", "Completed joinCustomAudience")
}
override fun onError(error: AdServicesException) {
// Handle error
Log.e("CustomAudience", "Error executing joinCustomAudience", error)
}
};
جاوا
OutcomeReceiver callback = new OutcomeReceiver<Void, AdServicesException>() {
@Override
public void onResult(@NonNull Void result) {
Log.i("CustomAudience", "Completed joinCustomAudience");
}
@Override
public void onError(@NonNull AdServicesException error) {
// Handle error
Log.e("CustomAudience", "Error executing joinCustomAudience", error);
}
};
یک مخاطب سفارشی بگذارید
اگر کاربر دیگر معیارهای کسبوکار را برای یک مخاطب سفارشی خاص برآورده نمیکند، یک برنامه یا SDK میتواند leaveCustomAudience()
برای حذف مخاطبان سفارشی از دستگاه فراخوانی کند. برای حذف CustomAudience
بر اساس پارامترهای منحصر به فرد آن، موارد زیر را انجام دهید:
- شی
CustomAudienceManager
را راه اندازی کنید. -
LeaveCustomAudienceRequest
باbuyer
وname
مخاطب سفارشی راه اندازی کنید. برای کسب اطلاعات بیشتر در مورد این فیلدهای ورودی، " پیوستن به یک مخاطب سفارشی " را بخوانید. - متد
leaveCustomAudience()
ناهمزمان را با شیLeaveCustomAudienceRequest
و اشیاءExecutor
وOutcomeReceiver
مربوطه فراخوانی کنید.
کاتلین
val customAudienceManager: CustomAudienceManager =
context.getSystemService(CustomAudienceManager::class.java)
// Initialize a LeaveCustomAudienceRequest
val leaveCustomAudienceRequest: LeaveCustomAudienceRequest =
LeaveCustomAudienceRequest.Builder()
.setBuyer(buyer)
.setName(name)
.build()
// Request to leave a custom audience
customAudienceManager.leaveCustomAudience(
leaveCustomAudienceRequest,
executor,
outcomeReceiver)
جاوا
CustomAudienceManager customAudienceManager =
context.getSystemService(CustomAudienceManager.class);
// Initialize a LeaveCustomAudienceRequest
LeaveCustomAudienceRequest leaveCustomAudienceRequest =
new LeaveCustomAudienceRequest.Builder()
.setBuyer(buyer)
.setName(name)
.build();
// Request to leave a custom audience
customAudienceManager.leaveCustomAudience(
leaveCustomAudienceRequest,
executor,
outcomeReceiver);
مشابه فراخوانی joinCustomAudience()
، OutcomeReceiver
پایان تماس API را نشان می دهد. برای کمک به محافظت از حریم خصوصی، نتیجه خطا بین خطاهای داخلی و آرگومان های نامعتبر تمایز قائل نمی شود. onResult()
زمانی فراخوانی می شود که فراخوانی API تکمیل شود، خواه مخاطب سفارشی منطبق با موفقیت حذف شود یا خیر.
انتخاب آگهی را اجرا کنید
برای استفاده از Protected Audience API برای انتخاب تبلیغات، متد selectAds()
را فراخوانی کنید:
- یک شی
AdSelectionManager
را راه اندازی کنید. - یک شی
AdSelectionConfig
بسازید. - متد
selectAds()
ناهمزمان را با شیAdSelectionConfig
و اشیاءExecutor
وOutcomeReceiver
مربوطه فراخوانی کنید.
کاتلین
val adSelectionManager: AdSelectionManager =
context.getSystemService(AdSelectionManager::class.java)
// Initialize AdSelectionConfig
val adSelectionConfig: AdSelectionConfig =
AdSelectionConfig.Builder().setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.setBuyerContextualAds(
Collections.singletonMap(
contextualAds.getBuyer(), contextualAds
)
).build()
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(
adSelectionConfig, executor, outcomeReceiver
)
جاوا
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize AdSelectionConfig
AdSelectionConfig adSelectionConfig =
new AdSelectionConfig.Builder()
.setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.setBuyerContextualAds(
Collections.singletonMap(contextualAds.getBuyer(), contextualAds)
)
.build();
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(adSelectionConfig, executor, outcomeReceiver);
متد selectAds()
به یک ورودی AdSelectionConfig
نیاز دارد که در آن باید پارامترهای مورد نیاز زیر را مشخص کنید:
- فروشنده : شناسه شبکه تبلیغات فروشنده که انتخاب آگهی را آغاز می کند.
- URL منطق تصمیم : یک نشانی اینترنتی HTTPS که برای به دست آوردن منطق جاوا اسکریپت شبکه تبلیغات فروشنده درخواست شده است.
- نشانی وب HTTPS : برای به دست آوردن منطق جاوا اسکریپت شبکه تبلیغات فروشنده درخواست شد. امضاهای تابع مورد نیاز را مشاهده کنید.
- URI از پیش ساخته شده : که از قالب انتخاب آگهی FLEDGE پیروی می کند.
IllegalArgumentException
پرتاب می شود، اگر یک uri از پیش ساخته شده پشتیبانی نشده یا نادرست ارسال شود.
- خریداران مخاطب سفارشی : فهرست کاملی از شناسههای شبکههای تبلیغاتی خریدار که توسط فروشنده مجاز به شرکت در فرآیند انتخاب آگهی هستند. این شناسههای خریدار با
CustomAudience.getBuyer()
مخاطبان سفارشی شرکتکننده مطابقت دارند.
پارامترهای زیر را می توان به صورت اختیاری برای انتخاب آگهی سفارشی تر مشخص کرد:
- سیگنالهای انتخاب آگهی : یک شی JSON، بهصورت رشتهای، حاوی سیگنالهایی است که باید توسط جاوا اسکریپت منطق پیشنهاد خریدار مصرف شود که از
CustomAudience.getBiddingLogicUrl()
واکشی شده است. - سیگنالهای فروشنده : یک شی JSON، سریالسازی شده به صورت رشته، حاوی سیگنالهایی است که توسط منطق تصمیمگیری جاوا اسکریپت واکشی شده فروشنده از
AdSelectionConfig.getDecisionLogicUrl()
مصرف میشود. - سیگنالهای هر خریدار : نقشهای از اشیاء JSON، بهصورت رشتهای، حاوی سیگنالهایی است که باید توسط جاوا اسکریپت منطق پیشنهادی خریداران خاص مصرف شود که از
CustomAudience.getBiddingLogicUrl()
واکشی شده است، که توسط فیلدهای خریدار مخاطبان سفارشی شرکتکننده شناسایی میشوند. - تبلیغات متنی: مجموعه ای از کاندیداهای تبلیغاتی که مستقیماً از خریداران در طول حراجی که خارج از حراج مخاطب محافظت شده انجام می شود جمع آوری می شود.
پس از انتخاب یک تبلیغ، نتایج، پیشنهادات و سیگنالها به صورت داخلی برای گزارشدهی باقی میمانند. OutcomeReceiver.onResult()
یک AdSelectionOutcome
را برمی گرداند که حاوی:
- یک URL رندر برای تبلیغ برنده، که از
AdData.getRenderUrl()
بدست آمده است. - شناسه انتخاب آگهی منحصر به فرد برای کاربر دستگاه. این شناسه برای گزارش نمایش تبلیغات استفاده می شود.
اگر به دلایلی مانند آرگومانهای نامعتبر، مهلت زمانی یا مصرف بیش از حد منابع، انتخاب آگهی با موفقیت انجام نشود، فراخوانی OutcomeReceiver.onError()
یک AdServicesException
با رفتارهای زیر ارائه میکند:
- اگر انتخاب آگهی با آرگومان های نامعتبر آغاز شود،
AdServicesException
یکIllegalArgumentException
را به عنوان علت نشان می دهد. - همه خطاهای دیگر
AdServicesException
با یکIllegalStateException
به عنوان علت دریافت می کنند.
تبلیغات متنی
مخاطب محافظت شده می تواند تبلیغات متنی را در یک حراج محافظت شده بگنجاند. تبلیغات متنی باید در سرور فناوری تبلیغات انتخاب شوند و خارج از APIهای مخاطب محافظت شده به دستگاه بازگردانده شوند. سپس تبلیغات متنی را میتوان با استفاده از AdSelectionConfig
در حراج گنجاند که در آن نقطه مانند تبلیغات دستگاه عمل میکنند، از جمله واجد شرایط بودن برای فیلتر تبلیغات منفی. پس از اتمام حراج مخاطب محافظت شده، باید reportImpression()
را فراخوانی کنید. این reportWin()
در تبلیغات متنی برنده، به همان الگوی گزارش نمایش ، فراخوانی میکند تا آگهی برنده را در دستگاه دریافت کند. هر آگهی متنی به یک خریدار، یک پیشنهاد، یک پیوند به منطق گزارش، یک URL رندر و ابرداده تبلیغات نیاز دارد.
برای استقرار تبلیغات متنی در برنامه، برنامه هدف باید یک شی ContextualAds
ایجاد کند:
کاتلین
val contextualAds: ContextualAds =
Builder().setBuyer(AdTechIdentifier.fromString(mBiddingLogicUri.getHost()))
//Pass in your valid app install ads
.setDecisionLogicUri(mContextualLogicUri)
.setAdsWithBid(appInstallAd)
.build()
جاوا
ContextualAds contextualAds = new ContextualAds.Builder()
.setBuyer(AdTechIdentifier.fromString(mBiddingLogicUri.getHost()))
.setDecisionLogicUri(mContextualLogicUri)
//Pass in your valid app install ads
.setAdsWithBid(appInstallAd)
.build();
شی ContextualAds
حاصل میتواند هنگام ایجاد AdSelectionConfig
شما ارسال شود:
کاتلین
// Create a new ad
val noFilterAd: AdData = Builder()
.setMetadata(JSONObject().toString())
.setRenderUri(Uri.parse(baseUri + NO_FILTER_RENDER_SUFFIX))
.build()
val noFilterAdWithBid = AdWithBid(noFilterAd, NO_FILTER_BID)
contextualAds.getAdsWithBid().add(noFilterAdWithBid)
جاوا
// Create a new ad
AdData noFilterAd = new AdData.Builder()
.setMetadata(new JSONObject().toString())
.setRenderUri(Uri.parse(baseUri + NO_FILTER_RENDER_SUFFIX))
.build();
AdWithBid noFilterAdWithBid = new AdWithBid(noFilterAd, NO_FILTER_BID);
contextualAds.getAdsWithBid().add(noFilterAdWithBid);
فیلتر کردن تبلیغات نصب برنامه
فیلتر کردن تبلیغات نصب برنامه به شما کمک می کند تا تبلیغات نصب را برای برنامه هایی که قبلاً روی دستگاه نصب شده اند فیلتر کنید.
اولین گام در این فرآیند این است که مشخص کنیم کدام تبلیغکنندگان توانایی فیلتر کردن بسته نصب شده را دارند. این باید در برنامهای که میخواهید با یک تبلیغ هدف قرار دهید اتفاق بیفتد.
کاتلین
//Create a request for setting the app install advertisers
val adtech = AdTechIdentifier.fromString("your.enrolled.uri")
val adtechSet = setOf(adtech)
val request = SetAppInstallAdvertisersRequest(adtechSet)
//Set the app install advertisers in the ad selection manager
mAdSelectionManager.setAppInstallAdvertisers(
request,
mExecutor,
object : OutcomeReceiver<Any?, Exception?>() {
fun onResult(@NonNull ignoredResult: Any?) {
Log.v("[your tag]", "Updated app install advertisers")
}
fun onError(@NonNull error: Exception?) {
Log.e("[your tag]", "Failed to update app install advertisers", error)
}
})
جاوا
//Create a request for setting the app install advertisers
AdTechIdentifier adtech = AdTechIdentifier.fromString("your.enrolled.uri");
Set<AdTechIdentifier> adtechSet = Collections.singleton(adtech);
SetAppInstallAdvertisersRequest request = new SetAppInstallAdvertisersRequest(adtechSet);
//Set the app install advertisers in the ad selection manager
mAdSelectionManager.setAppInstallAdvertisers(
request,
mExecutor,
new OutcomeReceiver<Object, Exception>() {
@Override
public void onResult(@NonNull Object ignoredResult) {
Log.v("[your tag]", "Updated app install advertisers");
}
@Override
public void onError(@NonNull Exception error) {
Log.e("[your tag]", "Failed to update app install advertisers", error);
}
});
وقتی کد قبلی اجرا میشود، تبلیغکنندگان میتوانند برنامههای نصبشدهای را که در طول تولید پیشنهادشان مشخص کردهاید فیلتر کنند. اگر میخواهید تبلیغکنندهای را از دسترسی به وضعیت نصب این برنامه حذف کنید، این کد را دوباره با حذف اطلاعات تبلیغکننده اجرا کنید.
گام بعدی تنظیم فیلترینگ تبلیغات در داخل برنامه ناشر است. طرفی که تبلیغ را در داخل برنامه ناشر ارائه می دهد (به احتمال زیاد یک SDK سمت عرضه است) باید شی AdFilters
خود را با اطلاعاتی در مورد تبلیغات مرتبط با برنامه هایی که می خواهند فیلتر کنند، مقداردهی اولیه کند:
کاتلین
// Instantiate AdFilters object with package names.
val filters: AdFilters = Builder().setAppInstallFilters(
Builder().setPackageNames(setOf("example.target.app")).build()
).build()
جاوا
// Instantiate AdFilters object with package names.
AdFilters filters = new AdFilters.Builder()
.setAppInstallFilters(
new AppInstallFilters.Builder()
.setPackageNames(Collections.singleton("example.target.app"))
.build())
.build();
ناشران طرف تقاضا همچنین ممکن است یک AdFilter
برای تبلیغاتی که در داخل مخاطبان سفارشی آنها وجود دارد تنظیم کنند.
AdFilters
همچنین می تواند در نقطه نمونه سازی یک شی جدید AdData
ارسال شود:
کاتلین
// Instantiate an AdData object with the AdFilters created in the
// previous example.
val appInstallAd: AdData =
Builder().setMetadata("{ ... }") // Valid JSON string
.setRenderUri(Uri.parse("www.example-dsp1.com/.../campaign123.html"))
.setAdFilters(filters).build()
جاوا
// Instantiate an AdData object with the AdFilters created in the
// previous example.
AdData appInstallAd = new AdData.Builder()
.setMetadata("{ ... }") // Valid JSON string
.setRenderUri(Uri.parse("www.example-dsp1.com/.../campaign123.html"))
.setAdFilters(filters)
.build();
فیلتر درب فرکانس
فیلتر کردن درب فرکانس به متخصصان تبلیغات امکان می دهد تعداد دفعات نمایش یک تبلیغ را محدود کنند. فیلتر کردن درب فرکانس نوردهی بیش از حد تبلیغات را کاهش میدهد و انتخاب تبلیغات جایگزین را برای یک کمپین تبلیغاتی خاص بهینه میکند.
دو جزء اصلی فیلتر درب فرکانس وجود دارد: نوع رویداد تبلیغاتی و کلید شمارنده تبلیغات. انواع رویدادهای تبلیغاتی موجود که می توانند استفاده شوند عبارتند از:
- برنده (به زودی) : یک رویداد برنده نشان می دهد که آگهی برنده یک حراج شده است. رویدادهای Win بهطور خودکار توسط Protected Audience API بهروزرسانی میشوند و برنامهنویس نمیتواند مستقیماً آنها را فراخوانی کند. داده های Win فقط برای تبلیغات در یک مخاطب خاص قابل مشاهده است.
- Impression : جدا از
reportImpression
، تماس گیرنده روی دستگاه (SSP یا MMP) ازupdateAdCounterHistogram()
برای فراخوانی رویدادهای impression در نقطه کدی که انتخاب می کند استفاده می کند. رویدادهای Impression برای همه تبلیغات متعلق به یک DSP مشخص قابل مشاهده است و محدود به تبلیغات در همان مخاطبان سفارشی نیست. - نمایش : رویداد توسط تماس گیرنده روی دستگاه (SSP یا MMP) در نقطه ای از کد که با استفاده از فراخوانی برای
updateAdCounterHistogram()
انتخاب می کند، فراخوانی می شود. مشاهده رویدادها برای همه تبلیغات متعلق به یک DSP مشخص قابل مشاهده است و به تبلیغات در همان مخاطب سفارشی محدود نمی شود. - کلیک کنید : رویداد توسط تماس گیرنده روی دستگاه (SSP یا MMP) در نقطه ای از کد که با استفاده از فراخوانی برای
updateAdCounterHistogram()
انتخاب می کند، فراخوانی می شود. رویدادهای کلیک برای همه تبلیغات متعلق به یک DSP مشخص قابل مشاهده است و به تبلیغات در همان مخاطبان سفارشی محدود نمی شود.
در برنامه ناشر، یک SSP یا MMP که در دستگاه حضور دارد رویدادهای تبلیغاتی را فراخوانی می کند. هنگامی که updateAdCounterHistogram()
فراخوانی می شود، شمارنده فیلتر درب فرکانس افزایش می یابد تا مزایده های آینده اطلاعات به روزی در مورد مواجهه کاربر با یک تبلیغ خاص داشته باشند. انواع رویدادهای تبلیغاتی به اجبار به عملکرد کاربر مربوطه گره نمیخورند و دستورالعملهایی هستند که به تماسگیرندگان کمک میکنند تا سیستم رویداد خود را ساختار دهند. برای افزایش شمارنده آگهی در زمان یک رویداد، بازیگر روی دستگاه شناسه انتخاب آگهی مزایده آگهی برنده را ارائه میکند.
کلیدهای شمارنده آگهی، اعداد صحیح امضا شده 32 بیتی هستند که توسط فناوری تبلیغاتی خریدار تخصیص داده شدهاند، و مطابق با مجموعهای از تبلیغات هستند که توسط DSP تعریف شده است. از آنجایی که کلیدهای شمارنده تبلیغات فقط به تبلیغاتی محدود میشوند که به یک DSP معین تعلق دارند، این کلیدها را میتوان بدون همپوشانی با هیستوگرامهای یک فناوری تبلیغاتی دیگر انتخاب کرد. کلیدهای شمارنده تبلیغات برای افزایش شناسههای خاص DSP در تبلیغات DSP یا در یک مخاطب سفارشی خاص برای فیلتر کردن تبلیغات از حراجهای آینده استفاده میشوند.
از کلیدهای شمارنده می توان برای اولویت بندی تبلیغاتی استفاده کرد که بر اساس تعامل آنها با سایر تبلیغات از یک فناوری تبلیغاتی خریدار خاص، برای یک کاربر خاص جالب تر هستند. به عنوان مثال، تبلیغی که سطح بالایی از تعامل را از برنده مزایده ها، بازدیدها و کلیک ها دریافت کرده است، یک نقطه داده استنباط شده را نشان می دهد. برای نشان دادن بیشتر این نکته: یک تبلیغ برای چوب گلف چپ دست ممکن است نشان دهد که کاربر علاقه ای به چپ دست ها ندارد. یک فیلتر درپوش فرکانس تنظیم شده برای یک کلید شمارنده که به تبلیغات چپ دست اختصاص داده شده است، می تواند تبلیغات باشگاه های راست دست را فیلتر کند.
برای استفاده از محدودیت فرکانس در حراج خود، ابتدا باید اشیاء KeyedFrequencyCap
را مطابق شکل زیر ایجاد کنید:
کاتلین
// Value used when incrementing frequency counter
val adCounterKey = 123
// Frequency cap exceeded after 2 counts
val keyedFrequencyCapForImpression: KeyedFrequencyCap = Builder(
adCounterKey, 2, Duration.ofSeconds(10)
).build()
// Frequency cap exceeded after 1 counts
val keyedFrequencyCapForImpression: KeyedFrequencyCap = Builder(
adCounterKey, 1, Duration.ofSeconds(10)
).build()
جاوا
// Value used when incrementing frequency counter
int adCounterKey = 123;
// Frequency cap exceeded after 2 counts
KeyedFrequencyCap keyedFrequencyCapForImpression =
new KeyedFrequencyCap.Builder(
adCounterKey, 2, Duration.ofSeconds(10)
).build();
// Frequency Cap exceeded after 1 counts
KeyedFrequencyCap keyedFrequencyCapForClick =
new KeyedFrequencyCap.Builder(
adCounterKey, 1, Duration.ofSeconds(10)
).build();
هنگامی که اشیاء KeyedFrequencyCap
ایجاد شدند، می توانید آنها را به یک شی AdFilters
منتقل کنید.
کاتلین
val filters: AdFilters = Builder()
.setFrequencyCapFilters(
Builder()
.setKeyedFrequencyCapsForImpressionEvents(
ImmutableObject.of(keyedFrequencyCapForImpression)
)
.setKeyedFrequencyCapsForClickEvents(
ImmutableObject.of(keyedFrequencyCapForClick)
)
).build()
جاوا
AdFilters filters = new AdFilters.Builder()
.setFrequencyCapFilters(new FrequencyCapFilters.Builder()
.setKeyedFrequencyCapsForImpressionEvents(
ImmutableObject.of(keyedFrequencyCapForImpression)
)
.setKeyedFrequencyCapsForClickEvents(
ImmutableObject.of(keyedFrequencyCapForClick)
)
).build();
هنگامی که شیء AdFilters
با فیلترهای درب فرکانس پر می شود، می توان آن را در هنگام ایجاد مخاطب سفارشی به آن منتقل کرد:
کاتلین
// Initialize a custom audience.
val audience: CustomAudience = Builder()
.setBuyer(buyer)
.setName(name)
.setAds(
listOf(
Builder()
.setRenderUri(renderUri)
.setMetadata(JSONObject().toString())
.setAdFilters(filters)
.setAdCounterKeys(adCounterKeys)
.build()
)
).build()
جاوا
// Initialize a custom audience.
CustomAudience audience = new CustomAudience.Builder()
.setBuyer(buyer)
.setName(name)
.setAds(Collections.singletonList(new AdData.Builder()
.setRenderUri(renderUri)
.setMetadata(new JSONObject().toString())
.setAdFilters(filters)
.setAdCounterKeys(adCounterKeys)
.build()))
.build();
هنگامی که فیلترهای سقف فرکانس در یک مخاطب سفارشی پیاده سازی می شوند، SSP می تواند رویدادهای کلیک، مشاهده یا نمایش لازم را فراخوانی کند.
کاتلین
val callerAdTech: AdTechIdentifier = mAdSelectionConfig.getSeller()
val request: UpdateAdCounterHistogramRequest = Builder(
adSelectionId,
FrequencyCapFilters.AD_EVENT_TYPE_CLICK, //CLICK, VIEW, or IMPRESSION
callerAdTech
).build()
جاوا
AdTechIdentifier callerAdTech = mAdSelectionConfig.getSeller();
UpdateAdCounterHistogramRequest request =
new UpdateAdCounterHistogramRequest.Builder(
adSelectionId,
FrequencyCapFilters.AD_EVENT_TYPE_CLICK, //CLICK, VIEW, or IMPRESSION
callerAdTech
).build();
تبلیغاتی که به محدودیت های فیلتر فرکانس از پیش تعیین شده خود رسیده اند، از حراج فیلتر می شوند. فیلتر کردن قبل از اجرای منطق مناقصه برای مزایدههای روی دستگاه انجام میشود، و از آنجایی که بار برای مزایدههای خدمات مزایده و مزایده ایجاد میشود. این جعبه ابزار به فناوریهای تبلیغات انعطافپذیری میدهد تا از تعاملات بین کاربران و تبلیغات درون مخاطبان سفارشی خود برای متمرکز کردن تبلیغات استفاده کنند. هدف گذاری در حالی که نوردهی بیش از حد تبلیغات را به حداقل می رساند.
فیلتر کردن تبلیغات متنی بدون تماس شبکه
اگر تقاضای بازاریابی مجدد در دستگاه وجود ندارد، می توانید انتخاب آگهی را برای تبلیغات متنی بدون تماس شبکه اجرا کنید. با URI های از پیش ساخته شده و لیستی از تبلیغات متنی با پیشنهاد، این پلتفرم می تواند از بازیابی منطق مناقصه، سیگنال های مناقصه و سیگنال های امتیازدهی صرف نظر کند. این پلتفرم از یک URI از پیش ساخته شده برای انتخاب آگهی متنی با بالاترین پیشنهاد استفاده می کند.
برای بهبود تأخیر، فناوریهای تبلیغاتی میتوانند یک جریان انتخاب آگهی را اجرا کنند که فقط شامل تبلیغات متنی با قابلیت فیلتر کردن آگهی بدون تماس شبکه است. این با استفاده از URI های از پیش ساخته شده برای امتیاز دهی سیگنال ها به دست می آید. برای لیستی از پیاده سازی scoreAds
، به بخش موارد استفاده و نام های URI از پیش ساخته شده پشتیبانی شده مراجعه کنید.
برای اجرای انتخاب آگهی بدون تماس شبکه:
- فیلترینگ تبلیغات را تنظیم کنید
- تبلیغات متنی خود را ایجاد کنید
یک شی
AdSelectionConfig
با موارد زیر ایجاد کنید:- یک لیست خالی از خریداران
- یک URI از پیش ساخته شده برای انتخاب بالاترین پیشنهاد
- تبلیغات متنی
- یک URI خالی برای سیگنال های امتیازدهی. URI خالی مجاز است نشان دهد که نمیخواهید از واکشی سیگنالهای مطمئن برای امتیازدهی استفاده کنید:
Uri prebuiltURIScoringUri = Uri.parse("ad-selection-prebuilt://ad-selection/highest-bid-wins/?reportingUrl=your.registered.uri/reporting"); // Initialize AdSelectionConfig AdSelectionConfig adSelectionConfig = new AdSelectionConfig.Builder() .setSeller(seller) .setDecisionLogicUri(prebuiltURIScoringUri) .setCustomAudienceBuyers(Collections.emptyList()) .setAdSelectionSignals(adSelectionSignals) .setSellerSignals(sellerSignals) .setPerBuyerSignals(perBuyerSignals) .setBuyerContextualAds(buyerContextualAds) .setTrustedScoringSignalsUri(Uri.EMPTY) .build();
اجرای انتخاب آگهی:
adSelectionManager.selectAds( adSelectionConfig, executor, outcomeReceiver);
هنگام استفاده از URI های از پیش ساخته شده، جاوا اسکریپت گزارشی خود را اجرا کنید
امروزه، پلتفرم Privacy Sandbox تنها دارای یک پیادهسازی اولیه جاوا اسکریپت گزارشدهی برای URIهای از پیش ساخته شده است. اگر میخواهید جاوا اسکریپت گزارشدهی خود را اجرا کنید در حالی که هنوز از URIهای از پیش ساخته شده برای انتخاب تبلیغات با تأخیر کم استفاده میکنید، میتوانید DecisionLogicUri
بین انتخاب آگهی و اجراهای گزارش لغو کنید.
- مراحل اجرای انتخاب آگهی برای تبلیغات متنی را با استفاده از URIهای از پیش ساخته شده اجرا کنید
قبل از اجرای گزارش، یک کپی از
AdSelectionConfig
خود ایجاد کنیدadSelectionConfigWithYourReportingJS = adSelectionConfig.cloneToBuilder() // Replace <urlToFetchYourReportingJS> with your own URL: .setDecisionLogicUri(Uri.parse(<urlToFetchYourReportingJS>)) .build();
اجرای گزارش گیری
// adSelectionId is from the result of the previous selectAds run ReportImpressionRequest request = new ReportImpressionRequest( adSelectionId, adSelectionConfigWithYourReportingJS); adSelectionManager.reportImpression( request, executor, outcomeReceiver);
میانجی گری آبشار را اجرا کنید
میانجیگری Waterfall به چندین SDK شخص ثالث (شبکه های 3P) نیاز دارد که توسط یک شبکه میانجی SDK شخص اول هماهنگ شوند. میانجی گری آبشار صرف نظر از اینکه مزایده روی دستگاه انجام شده باشد یا در خدمات Bidding & Auction (B&A) انجام شود، به همین ترتیب انجام می شود.
شبکه های 3P
شبکه های 3P باید یک آداپتور فراهم کنند که به شبکه میانجی اجازه می دهد تا روش های لازم را برای اجرای حراج فراخوانی کند:
- انتخاب آگهی را اجرا کنید
- گزارش برداشت ها
در اینجا نمونه ای از آداپتور شبکه میانجی آورده شده است:
کاتلین
class NetworkAdaptor {
private val adSelectionManager : AdSelectionManager
init {
adSelectionManager = context.getSystemService(AdSelectionManager::class.java)
}
fun selectAds() {...}
fun reportImpressions() {...}
}
جاوا
class NetworkAdaptor {
AdSelectionManager adSelectionManager;
public NetworkAdaptor() {
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
}
public void selectAds() {...}
public void reportImpressions() {...}
}
هر SDK دارای مدیران و مشتریان خدمات انتخاب آگهی و اجرای selectAds
و reportImpressions
خود است. ارائهدهندگان SDK میتوانند به بخشهای نحوه اجرای انتخاب آگهی برای حراجهای روی دستگاه یا توضیح B&A برای حراجهای B&A مراجعه کنند. نحوه گزارش نمایشهای تبلیغاتی را دنبال کنید (به دنبال گزارشگیری تک SSP برای گزارشگیری.
شبکه میانجیگری
مشابه شبکههای 3P، شبکههای میانجی به اجرای selectAds
و reportImpression
نیاز دارند. برای اطلاعات بیشتر به بخش نحوه اجرای انتخاب آگهی و نحوه گزارش نمایش تبلیغات مراجعه کنید.
شبکه های میانجی مسئولیت اجرای زنجیره میانجیگری و قرار دادن خود در زنجیره میانجیگری را بر عهده دارند. بخش بعدی نحوه راه اندازی و اجرای این فرآیند را پوشش می دهد.
بازیابی زنجیره میانجیگری و طبقات پیشنهادی
شبکه میانجی مسئولیت بازیابی آگهیهای متنی شخص اول (1P)، زنجیره میانجیگری و طبقات پیشنهادی شبکههای شخص ثالث (3P) را بر عهده دارد. این می تواند در یک درخواست برای بازیابی تبلیغات متنی اجرا شده توسط شبکه میانجی اتفاق بیفتد. زنجیره میانجی نحوه تکرار از طریق شبکههای 3P را تعیین میکند و طبقات پیشنهادی را میتوان به عنوان adSelectionSignals
به فرآیند حراج منتقل کرد.
قرارگیری شبکه در زنجیره میانجیگری
یک SDK میانجی میتواند خود را در زنجیره میانجیگری بر اساس eCPM زنده پیشنهادهای تبلیغاتی 1P قرار دهد. در Protected Audience API، پیشنهادات تبلیغاتی غیرشفاف هستند. یک SDK میانجی باید از AdSelectionFromOutcomesConfig
استفاده کند تا بتواند پیشنهاد یک آگهی 1P معین را با طبقه پیشنهادی شبکه 3P بعدی در زنجیره مقایسه کند. اگر پیشنهاد 1P بالاتر از کف قیمت باشد، این بدان معناست که SDK میانجی در مقابل آن شبکه 3P قرار می گیرد.
انتخاب آگهی را اجرا کنید
برای بازیابی یک نامزد تبلیغات 1P، شبکه میانجی میتواند یک حراج روی دستگاه را به دنبال مراحل بخش انتخاب آگهی اجرا اجرا کند. این یک نامزد تبلیغ 1P، یک پیشنهاد قیمت و یک AdSelectionId
ایجاد می کند که در فرآیند میانجیگری استفاده می شود.
یک AdSelectionFromOutcomesConfig ایجاد کنید
یک AdSelectionFromOutcomesConfig
به شبکه میانجی اجازه میدهد تا فهرستی از AdSelectionIds
(نتایج حراجهای قبلی)، سیگنالهای انتخاب آگهی و یک URI را برای واکشی جاوا اسکریپت که یک آگهی را از بین چندین نامزد انتخاب میکند، ارسال کند. فهرست AdSelectionIds به همراه پیشنهادات و سیگنالهای آنها به جاوا اسکریپت منتقل میشود که میتواند یکی از AdSelectionIds
در صورتی که کف قیمت را شکست دهد، یا اگر زنجیره میانجیگری ادامه یابد، هیچ کدام را برگرداند.
شبکههای میانجی یک AdSelectionFromOutcomesConfig
را با استفاده از 1P AdSelectionId
از بخش قبل ایجاد میکنند و کف پیشنهادی برای شبکه 3P در نظر گرفته میشود. یک AdSelectionFromOutcomesConfig
جدید باید برای هر مرحله در زنجیره میانجی ایجاد شود.
کاتلین
fun runSelectOutcome(
adSelectionClient : AdSelectionClient,
outcome1p : AdSelectionOutcome,
network3p : NetworkAdapter) : ListenableFuture<AdSelectionOutcome?> {
val config = AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(listOf(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.build()
return adSelectionClient.selectAds(config)
}
جاوا
public ListenableFuture<AdSelectionOutcome> runSelectOutcome(AdSelectionOutcome outcome1p,
NetworkAdapter network3p) {
AdSelectionFromOutcomesConfig config = new AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(Collection.singletonList(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.build();
return adSelectionClient.selectAds(config){}
}
نادیده گرفتن متد selectAds()
برای واسطه آبشار به یک ورودی AdSelectionFromOutcomesConfig
نیاز دارد که در آن باید پارامترهای مورد نیاز زیر را مشخص کنید:
- فروشنده : شناسه شبکه تبلیغات فروشنده که انتخاب آگهی را آغاز می کند.
- AdSelectionIds : یک لیست تکی از
selectAds()
قبلی که برای یک تبلیغ 1P اجرا می شود. - سیگنالهای انتخاب آگهی : یک شی JSON، به صورت رشتهای، حاوی سیگنالهایی برای استفاده توسط منطق پیشنهاد خریدار. در این مورد، کف پیشنهادی بازیابی شده برای شبکه 3P داده شده را درج کنید.
- Selection Logic URI : یک نشانی وب HTTPS که در حین انتخاب تبلیغ برای واکشی جاوا اسکریپت شبکه میانجی برای انتخاب یک تبلیغ برنده درخواست شده است. امضاهای تابع مورد نیاز را در این جاوا اسکریپت مشاهده کنید. جاوا اسکریپت باید تبلیغ 3P را برگرداند اگر قیمت پیشنهادی بالاتر از سطح قیمت پیشنهادی باشد، یا در غیر این صورت
null
را برگرداند. این به SDK واسطهای اجازه میدهد تا زنجیره میانجیگری را در صورت یافتن برنده قطع کند.
با ایجاد AdSelectionOutcomesConfig
، متد selectAds()
شبکه 3P را که اولین بار در زنجیره قرار دارد فراخوانی کنید.
کاتلین
val adSelectionManager = context.getSystemService(AdSelectionManager::class.java)
// Initialize AdSelectionFromOutcomesConfig
AdSelectionFromOutcomesConfig adSelectionFromOutcomesConfig =
AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(listof(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.setAdSelectionIds(outcomeIds)
.build()
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(
adSelectionFromOutcomesConfig,
executor,
outcomeReceiver)
جاوا
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize AdSelectionFromOutcomesConfig
AdSelectionFromOutcomesConfig adSelectionFromOutcomesConfig =
new AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(Collection.singletonList(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.setAdSelectionIds(outcomeIds)
.build();
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(
adSelectionFromOutcomesConfig,
executor,
outcomeReceiver);
وساطت آبشار ارکستر
در زیر ترتیب عملیات برای اجرای فرآیند میانجیگری آمده است.
- انتخاب آگهی 1P را اجرا کنید.
- در زنجیره میانجی تکرار کنید. برای هر شبکه 3P موارد زیر را انجام دهید:
- ایجاد
AdSelectionFromOutcomeConfig
شامل 1PoutcomeId
و کف پیشنهادی SDK 3P. -
selectAds()
با پیکربندی مرحله قبل فراخوانی کنید. - اگر نتیجه خالی نبود، آگهی را برگردانید.
- متد
selectAds()
آداپتور شبکه SDK فعلی را فراخوانی کنید. اگر نتیجه خالی نبود، آگهی را برگردانید.
- ایجاد
- اگر هیچ برنده ای از زنجیره پیدا نشد، تبلیغ 1P را برگردانید.
کاتلین
fun runWaterfallMediation(mediationChain : List<NetworkAdapter>)
: Pair<AdSelectionOutcome, NetworkAdapter> {
val outcome1p = runAdSelection()
var outcome : AdSelectionOutcome
for(network3p in mediationChain) {
outcome = runSelectOutcome(outcome1p, network3p)
if (outcome1p.hasOutcome() && outcome.hasOutcome()) {
return Pair(outcome, this)
}
outcome = network3p.runAdSelection()
if(outcome.hasOutcome()) {
return Pair(outcome, network3p)
}
}
return Pair(outcome1p, this)
}
جاوا
class MediationNetwork {
AdSelectionManager adSelectionManager;
public MediationNetwork() {
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
}
public void runAdSelection() {...}
public void reportImpressions() {...}
public Pair<AdSelectionOutcome, NetworkAdapter> runWaterfallMediation(
List<NetworkAdapter> mediationChain) {
AdSelectionOutcome outcome1p = runAdSelection();
AdSelectionOutcome outcome;
for(NetworkAdapter network3p: mediationChain) {
if (outcome1p.hasOutcome() &&
(outcome = runSelectOutcome(outcome1p, network3p)).hasOutcome()) {
return new Pair<>(outcome, this);
}
if((outcome = network3p.runAdSelection()).hasOutcome()) {
return new Pair<>(outcome, network3p);
}
}
return new Pair<>(outcome1p, this);
}
/* Runs comparison by creating an AdSelectionFromOutcomesConfig */
public AdSelectionOutcome runSelectOutcome(AdSelectionOutcome outcome1p,
NetworkAdapter network3p) { ... }
}
گزارش نمایش تبلیغات
بسته به نحوه اجرای حراج، دو جریان برای گزارش نمایش یک آگهی وجود دارد. اگر یک SSP مجرد هستید که حراجی را اجرا می کند، این بخش را دنبال کنید. اگر میخواهید میانجیگری آبشار را پیادهسازی کنید، مراحلی را که در بخش گزارشگیری میانجیگری آبشار یافت میشود دنبال کنید.
گزارش برداشت SSP منفرد
پس از انتخاب یک تبلیغ برنده از گردش کار انتخاب آگهی، میتوانید با متد AdSelectionManager.reportImpression()
نمایش را به پلتفرمهای طرف خرید و فروش شرکتکننده گزارش دهید. برای گزارش یک نمایش آگهی:
- یک شی
AdSelectionManager
را راه اندازی کنید. - یک شی
ReportImpressionRequest
با شناسه انتخاب آگهی بسازید. - متد ناهمزمان
reportImpression()
با شیReportImpressionRequest
و اشیاءExecutor
وOutcomeReceiver
مربوطه فراخوانی کنید.
جاوا
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize a ReportImpressionRequest
ReportImpressionRequest reportImpressionRequest =
new ReportImpressionRequest.Builder()
.setAdSelectionId(adSelectionId)
.setAdSelectionConfig(adSelectionConfig)
.build();
// Request to report the impression with the ReportImpressionRequest
adSelectionManager.reportImpression(
reportImpressionRequest,
executor,
outcomeReceiver);
کاتلین
val adSelectionManager = context.getSystemService(AdSelectionManager::class.java)
// Initialize a ReportImpressionRequest
val adSelectionConfig: ReportImpressionRequest =
ReportImpressionRequest.Builder()
.setAdSelectionId(adSelectionId)
.setAdSelectionConfig(adSelectionConfig)
.build()
// Request to report the impression with the ReportImpressionRequest
adSelectionManager.reportImpression(
reportImpressionRequest,
executor,
outcomeReceiver)
ReportImpressionRequest
را با پارامترهای مورد نیاز زیر راه اندازی کنید:
- شناسه انتخاب آگهی : شناسه ای منحصر به فرد برای کاربر دستگاهی که انتخاب آگهی موفقی را شناسایی می کند.
- پیکربندی انتخاب آگهی : همان پیکربندی مورد استفاده در
selectAds()
که توسط شناسه انتخاب آگهی ارائه شده مشخص شده است.
متد ناهمزمان reportImpression()
از شی OutcomeReceiver
برای سیگنال دادن به نتیجه فراخوانی API استفاده می کند.
- فراخوانی
onResult()
نشان میدهد که آیا URLهای گزارشدهنده impression ایجاد شدهاند و درخواست زمانبندی شده است. - فراخوانی
onError()
شرایط احتمالی زیر را نشان می دهد:- اگر تماس با یک آرگومان ورودی نامعتبر مقداردهی اولیه شود،
AdServicesException
یکIllegalArgumentException
را به عنوان علت نشان می دهد. - همه خطاهای دیگر
AdServicesException
با یکIllegalStateException
به عنوان علت دریافت می کنند.
- اگر تماس با یک آرگومان ورودی نامعتبر مقداردهی اولیه شود،
گزارش برداشت میانجی آبشار
یک SDK میانجی باید SDK برنده را ردیابی کند تا جریان گزارش آن را فعال کند. SDKهای شرکت کننده در یک زنجیره میانجی باید روشی را برای میانجی فراهم کنند تا بتواند جریان گزارش خود را راه اندازی کند. یک SDK که در یک حراج میانجی شرکت میکند، میتواند مراحل بالا را برای پیادهسازی گزارشهای خود دنبال کند.
SSP ها می توانند از این نمونه کد 3P SDK به عنوان نمونه اولیه برای نحوه پیوستن به جریان های میانجی استفاده کنند:
Pair<AdSelectionOutcome, NetworkAdapter> winnerOutcomeAndNetwork =
mediationSdk.orchestrateMediation(mediationChain);
if (winner.first.hasOutcome()) {
winner.second.reportImpressions(winner.first.getAdSelectionId());
نقاط پایانی گزارش گیری
API impression گزارش درخواستهای HTTPS GET را به نقاط پایانی ارائهشده توسط پلتفرم سمت فروش و پلتفرم سمت خرید برنده ارسال میکند:
نقطه پایانی پلت فرم سمت خرید:
- API از URL منطقی Bidding مشخص شده در مخاطبان سفارشی برای واکشی جاوا اسکریپت ارائه شده توسط خریدار استفاده می کند که شامل منطق برای بازگرداندن URL گزارش نمایش است.
- تابع جاوا اسکریپت
reportWin()
فراخوانی کنید، که انتظار میرود نشانی اینترنتی گزارش تصویری خریدار را برگرداند.
نقطه پایان پلت فرم سمت فروش:
- از URL منطقی تصمیم مشخص شده در شی
AdSelectionConfig
برای واکشی جاوا اسکریپت منطق تصمیم فروشنده استفاده کنید. - تابع جاوا اسکریپت
reportResult()
فراخوانی کنید، که انتظار میرود نشانی اینترنتی گزارشدهی نمایشی فروشنده را برگرداند.
گزارش خدمات مناقصه و مزایده
حراجی که در سرویسهای Bidding & Auction اجرا میشود، تمام اطلاعات گزارشدهی لازم، از جمله نشانیهای اینترنتی تولید شده برای گزارش تعامل با تبلیغات را خواهد داشت که در پاسخ رمزگذاریشده از حراج سمت سرور گنجانده شده است. هنگامی که پاسخ رمزگشایی می شود، URL های مناسب در پلتفرم ثبت می شوند، بنابراین گزارش تبلیغات و نمایش از همان مراحل ذکر شده در بالا پیروی می کند.
بهترین تلاش گزارش گیری
متد reportImpression()
برای ارائه بهترین تلاش برای تکمیل گزارش طراحی شده است.
گزارش تعاملات تبلیغاتی
مخاطب محافظت شده پشتیبانی میکند تا تعاملات دقیقتری را برای یک آگهی رندر شده گزارش دهد. این می تواند شامل تعاملاتی مانند زمان مشاهده، کلیک ها، شناورها یا هر معیار مفید دیگری باشد که می توان جمع آوری کرد. فرآیند دریافت این گزارش ها به دو مرحله نیاز دارد. ابتدا، خریداران و فروشندگان باید برای دریافت این گزارش ها در جاوا اسکریپت گزارش خود ثبت نام کنند. سپس، مشتری باید این رویدادها را گزارش کند.
ثبت نام برای دریافت رویدادهای تعاملی
ثبت نام برای رویدادهای تعامل در reportWin()
خریدار و reportResult()
فروشنده با استفاده از یک تابع جاوا اسکریپت ارائه شده توسط پلتفرم انجام می شود: registerAdBeacon
. برای ثبت نام برای دریافت گزارش رویداد، به سادگی با پلتفرم تابع جاوا اسکریپت از جاوا اسکریپت گزارشی خود تماس بگیرید. قطعه زیر از reportWin()
خریدار استفاده می کند، اما همین رویکرد برای reportResult()
نیز اعمال می شود.
reportWin(
adSelectionSignals,
perBuyerSignals,
signalsForBuyer,
contextualSignals,
customAudienceSignals) {
...
// Calculate reportingUri, clickUri, viewUri, and hoverUri
registerAdBeacon({"click": clickUri, "view": viewUri, "hover": hoverUri});
return reportingUri;
}
گزارش رویدادهای تعامل
پس از گزارش یک نمایش، مشتریان میتوانند با متد AdSelectionManager.reportInteraction()
، تعاملات را به پلتفرمهای طرف خرید و فروش برنده ثبتشده قبلی گزارش دهند. برای گزارش یک رویداد تبلیغاتی:
- یک شی
AdSelectionManager
را راه اندازی کنید. - یک شی
ReportInteractionRequest
با شناسه انتخاب آگهی، کلید تعامل، دادههای تعامل و مقصد گزارش بسازید. - متد
reportInteraction()
با شیrequest
و اشیاءExecutor
وOutcomeReceiver
مربوطه فراخوانی کنید.
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize a ReportInteractionRequest
ReportInteractionRequest request =
new ReportInteractionRequest.Builder()
.setAdSelectionId(adSelectionId)
.setInteractionKey("view")
.setInteractionData("{ viewTimeInSeconds : 1 }") // Can be any string
.setReportingDestinations(
FLAG_REPORTING_DESTINATION_BUYER | FLAG_REPORTING_DESTINATION_SELLER
)
.build();
// Request to report the impression with the ReportImpressionRequest
adSelectionManager.reportInteraction(
reportImpressionRequest,
executor,
outcomeReceiver);
ReportInteractionRequest
را با پارامترهای مورد نیاز زیر راه اندازی کنید:
- شناسه انتخاب آگهی : شناسه انتخاب آگهی بازیابی شده از
AdSelectionOutcome
که قبلاً بازگردانده شده است. - کلید تعامل : یک کلید رشته ای که توسط مشتری تعریف می شود و عمل گزارش شده را توصیف می کند. این باید با کلیدی مطابقت داشته باشد که توسط فروشنده یا خریدار در عملکردهای جاوا اسکریپت گزارش ثبت شده است.
- دادههای تعامل : رشتهای حاوی دادههایی که باید در گزارش رویداد گنجانده شود تا به سرورهای گزارشدهی ارسال شود.
- مقاصد گزارش : یک ماسک بیتی که مشخص می کند آیا رویدادها باید به خریدار، فروشنده یا هر دو گزارش شوند. این پرچم ها توسط پلت فرم ارائه می شوند و می توان ماسک مقصد نهایی را با استفاده از عملیات بیتی ایجاد کرد. برای گزارش به یک مقصد، می توانید از پرچم ارائه شده توسط پلت فرم به طور مستقیم استفاده کنید. برای گزارش دهی به مقصدهای متعدد، می توانید از OR (
|
) بیتی برای ترکیب مقادیر پرچم استفاده کنید.
متد ناهمزمان reportInteraction()
از شی OutcomeReceiver
برای سیگنال دادن به نتیجه فراخوانی API استفاده می کند.
- فراخوانی
onResult()
نشان میدهد که تماس تعاملی گزارش معتبر است. - فراخوانی
onError()
شرایط احتمالی زیر را نشان می دهد:- اگر تماس زمانی برقرار شود که برنامه در پسزمینه اجرا میشود، یک
IllegalStateException
با شرح خرابی برگردانده میشود. - اگر کلاینت از فراخوانی
reportInteraction()
محروم شود، یکLimitExceededException
برمی گردد. - اگر بسته برای فراخوانی APIهای حفظ حریم خصوصی ثبت نام نکرده باشد، یک
SecurityException()
برگردانده می شود. - اگر تعاملات گزارش برنامه با برنامه ای که
selectAds()
نامیده می شود متفاوت باشد، یکIllegalStateException
برگردانده می شود.
- اگر تماس زمانی برقرار شود که برنامه در پسزمینه اجرا میشود، یک
- اگر کاربر با فعال کردن APIهای Privacy Sandbox موافقت نکرده باشد، تماس بیصدا انجام نمیشود.
نقاط پایانی گزارش تعامل
API تعامل گزارش درخواستهای HTTPS POST را به نقاط پایانی ارائه شده توسط پلتفرم سمت فروش و پلتفرم سمت خرید برنده ارسال میکند. مخاطب محافظت شده کلیدهای تعامل را با URI های اعلام شده در گزارش جاوا اسکریپت مطابقت می دهد و برای هر تعاملی که گزارش می شود یک درخواست POST برای هر نقطه پایانی صادر می کند. نوع محتوای درخواست متن ساده است که بدنه آن داده های تعامل است.
بهترین تلاش گزارش تعامل
reportInteraction()
برای ارائه بهترین تلاش از گزارش از طریق HTTP Post طراحی شده است.
به روزرسانی پس زمینه روزانه
هنگام ایجاد مخاطب سفارشی ، برنامه یا SDK شما می تواند ابرداده مخاطبان سفارشی را آغاز کند. علاوه بر این ، این پلتفرم می تواند بخش های زیر از ابرداده مخاطبان سفارشی را با یک فرآیند به روزرسانی پس زمینه روزانه به روز کند.
- سیگنال های مناقصه کاربر
- داده های پیشنهادی قابل اعتماد
- لیست
AdData
این فرآیند در برابر URL به روزرسانی روزانه تعریف شده در مخاطبان سفارشی و URL ممکن است پاسخ JSON را بازگرداند.
- پاسخ JSON ممکن است شامل هر یک از قسمتهای ابرداده پشتیبانی شده باشد که باید به روز شوند.
- هر زمینه JSON به طور مستقل تأیید می شود. مشتری از هر زمینه ناقص که منجر به به روزرسانی در آن قسمت خاص در پاسخ می شود ، نادیده می گیرد.
- پاسخ HTTP خالی یا یک شیء JSON خالی "
{}
" منجر به به روزرسانی ابرداده نمی شود. - اندازه پیام پاسخ باید به 10 کیلوبایت محدود شود.
- تمام URI ها برای استفاده از HTTPS مورد نیاز هستند.
-
trusted_bidding_uri
باید همان ETLD+1 را به عنوان خریدار به اشتراک بگذارد.
مثال: پاسخ JSON برای به روزرسانی روزانه پس زمینه
{
"user_bidding_signals" : { ... }, // Valid JSON object
"trusted_bidding_data" : {
"trusted_bidding_uri" : 'example-dsp1-key-value-service.com',
"trusted_bidding_keys" : [ 'campaign123', 'campaign456', ... ]
},
'ads' : [
{
"render_uri" : 'www.example-dsp1.com/.../campaign123.html',
'metadata' : { ... } // Valid JSON object
},
{
"render_uri" : 'www.example-dsp1.com/.../campaign456.html',
'metadata' : { ... } // Valid JSON object
},
...
]
}
جاوا اسکریپت برای انتخاب تبلیغات
گردش کار انتخاب آگهی اجرای جاوا اسکریپت ارائه شده توسط خریدار و ارائه شده توسط فروشنده است.
JavaScript با ارائه دهنده خریدار از URL منطق مناقصه مشخص شده در مخاطبان سفارشی گرفته شده است. جاوا اسکریپت برگشتی باید شامل توابع زیر باشد:
JavaScript با ارائه دهنده فروشنده از URL منطق تصمیم گیری شده در پارامتر AdSelectionConfig
برای API انتخاب آگهی گرفته شده است. جاوا اسکریپت برگشتی باید شامل توابع زیر باشد:
تولید ()
function generateBid(
ad,
auction_signals,
per_buyer_signals,
trusted_bidding_signals,
contextual_signals,
user_signals,
custom_audience_bidding_signals) {
return {'status': 0, 'ad': ad, 'bid': ad.metadata.result };
}
پارامترهای ورودی:
-
ad
: یک شی json با فرمتvar ad = { 'render_url': url, 'metadata': json_metadata };
-
auction_signals, per_buyer_signals
: اشیاء JSON مشخص شده در شیء پیکربندی حراج custom_audience_bidding_signals
: شیء JSON تولید شده توسط سیستم عامل. قالب این شیء JSON:var custom_audience_signals = { "owner":"ca_owner", "buyer":"ca_buyer", "name":"ca_name", "activation_time":"ca_activation_time_epoch_ms", "expiration_time":"ca_expiration_time_epoch_ms", "user_bidding_signals":"ca_user_bidding_signals" }
کجا:
-
owner
،buyer
وname
از خواص با همین نام مخاطبان سفارشی که در انتخاب آگهی شرکت می کنند گرفته شده است -
activation_time
وexpiration_time
زمان فعال سازی و انقضاء مخاطبان سفارشی است که از زمان دوره یونیکس به عنوان ثانیه بیان شده است -
ca_user_bidding_signals
یک رشته JSON است که در قسمتuserBiddingSignals
ازCustomAudience
در زمان ایجاد مشخص شده است -
trusted_bidding_signals, contextual_signals
وuser_signals
اشیاء JSON هستند. آنها به عنوان اشیاء خالی منتقل می شوند و در نسخه های بعدی پر می شوند. قالب آنها توسط این پلتفرم اجرا نمی شود و توسط فناوری تبلیغاتی اداره می شود.
-
نتیجه:
-
ad
: آیا تبلیغی که پیشنهاد به آن اشاره دارد. این اسکریپت مجاز است نسخه ای از تبلیغی را که با ابرداده های مختلف دریافت کرده است ، بازگرداند. انتظار می رود خاصیتrender_url
تبلیغات بدون تغییر باشد. -
bid
: یک مقدار شناور که مقدار پیشنهاد این تبلیغ را نشان می دهد -
status
: یک مقدار عدد صحیح که می تواند باشد:-
0
: برای یک اعدام موفق -
1
: (یا هر مقدار غیر صفر) در صورت نامعتبر بودن هر یک از سیگنال های ورودی. در صورت بازگشت مقدار غیر صفر توسط تولید-پیشنهاد ، روند مناقصه برای همه تبلیغات CA باطل می شود
-
نقص ()
function scoreAd(
ad,
bid,
ad_selection_config,
seller_signals,
trusted_scoring_signals,
contextual_signal,
user_signal,
custom_audience_signal) {
return {'status': 0, 'score': score };
}
پارامترهای ورودی:
-
ad
: به مستنداتgenerateBid
مراجعه کنید -
bid
: ارزش پیشنهاد برای تبلیغ ad_selection_config
: یک شیء JSON که نشان دهنده پارامترAdSelectionConfig
از APIselectAds
. قالب این است:var ad_selection_config = { 'seller': 'seller', 'decision_logic_url': 'url_of_decision_logic', 'custom_audience_buyers': ['buyer1', 'buyer2'], 'auction_signals': auction_signals, 'per_buyer_signals': per_buyer_signals, 'contextual_ads': [ad1, ad2] }
seller_signals
: اشیاء JSON از پارامتر APIsellerSignals
AdSelectionConfig
خوانده شدهtrusted_scoring_signal
: از قسمتadSelectionSignals
در پارامترAdSelectionConfig
API بخوانیدcontextual_signals, user_signals
: اشیاء JSON. آنها در حال حاضر به عنوان اشیاء خالی منتقل می شوند و در نسخه های بعدی پر می شوند. قالب آنها توسط این پلتفرم اجرا نمی شود و توسط فناوری تبلیغاتی اداره می شود.per_buyer_signals
: شیء JSON از نقشهperBuyerSignal
در پارامترAdSelectionConfig
API با استفاده از به عنوان کلید خریدار مخاطب سفارشی فعلی خوانده شده است. اگر نقشه شامل هیچ ورودی برای خریدار داده شده نیست ، خالی شود.
خروجی:
-
score
: یک مقدار شناور که نشان دهنده مقدار نمره برای این تبلیغ است -
status
: یک مقدار عدد صحیح که می تواند باشد:- 0: برای یک اعدام موفق
- 1: در صورت نامعتبر بودن
customAudienceSignals
- 2: در صورت نامعتبر بودن
AdSelectionConfig
- 3: در صورت نامعتبر بودن هر یک از سیگنال های دیگر
- هر مقدار غیر صفر باعث خرابی فرآیند می شود ، مقدار نوع استثنا را تعیین می کند
selectoutcome ()
function selectOutcome(
outcomes,
selection_signals) {
return {'status': 0, 'result': null};
}
پارامترهای ورودی:
-
outcomes
: یک شی json{"id": id_string, "bid": bid_double}
-
selection_signals
: اشیاء JSON مشخص شده در شیء پیکربندی حراج
خروجی:
-
status
:0
برای موفقیت ، غیر صفر برای شکست -
result
: یکی از نتایج تصویب شده در یا تهی
Reportresult ()
function reportResult(ad_selection_config, render_url, bid, contextual_signals) {
return {
'status': status,
'results': {'signals_for_buyer': signals_for_buyer, 'reporting_url': reporting_url }
};
}
پارامترهای ورودی:
-
ad_selection_config
: به مستنداتscoreAds
مراجعه کنید -
render_url
: url رندر تبلیغ برنده -
bid
: پیشنهاد ارائه شده برای آگهی برنده -
contextual_signals
: به مستنداتgenerateBid
مراجعه کنید
خروجی:
-
status: 0
برای موفقیت و غیر صفر برای شکست -
results
: اشیاء JSON حاوی:-
signals_for_buyer
: یک شیء JSON که به عملکردreportWin
منتقل می شود -
reporting_url
: URL که توسط این سکو برای اطلاع رسانی به خریدار استفاده می شود
-
ReportWin ()
function reportWin(
ad_selection_signals,
per_buyer_signals,
signals_for_buyer,
contextual_signals,
custom_audience_signals) {
return {'status': 0, 'results': {'reporting_url': reporting_url } };
}
پارامترهای ورودی:
-
ad_selection_signals, per_buyer_signals
: به اسناد مربوط بهscoreAd
مراجعه کنید -
signals_for_buyer
: یک شیء JSON که توسطreportResult
بازگردانده شده است -
contextual_signals, custom_audience_signals
: به اسناد مربوط بهgenerateBid
مراجعه کنید
خروجی:
-
status: 0
برای موفقیت و غیر صفر برای شکست -
results
: یک شی json حاوی:-
reporting_url
: URL که توسط این سکو برای اطلاع رسانی به فروشنده استفاده می شود
-
RegisteradBeacon ()
function registerAdBeacon(
beacons
)
پارامترهای ورودی :
beacons
: یک شیء حاوی جفت ارزش کلیدی کلیدهای تعامل و گزارش URI. قالب این است:let beacons = { 'interaction_key': 'reporting_uri', 'interaction_key': 'reporting_uri', ... }
interaction_key
: رشته ای که نمایانگر این رویداد است. این مورد بعداً هنگام گزارش تعامل رویداد توسط این پلتفرم استفاده می شود تاreporting_uri
را که باید به آنها اطلاع داده شود ، جستجو کنید. این کلید باید بین آنچه خریدار یا فروشنده ثبت می کند مطابقت داشته باشد و فروشنده گزارش می دهد.-
reporting_uri
: URI برای دریافت گزارش های رویداد. این باید مخصوص نوع رویداد گزارش شده باشد. این باید یک درخواست پست را برای رسیدگی به هرگونه داده گزارش شده به همراه این رویداد بپذیرد.
به عنوان مثال:
let beacons = { 'click': 'https://reporting.example.com/click_event', 'view': 'https://reporting.example.com/view_event' }
انتخاب تبلیغات از پیش ساخته شده
URI های پیش ساخته به فناوری های تبلیغاتی امکان تعیین توابع JavaScript را برای منطق تصمیم گیری در انتخاب AD در کلاسهای AdSelectionConfig
و AdSelectionFromOutcomesConfig
می دهند. URI های پیش ساخته برای بارگیری JavaScript مربوطه نیازی به تماس های شبکه ندارند. فناوری های تبلیغاتی می توانند بدون نیاز به تنظیم دامنه ثبت نام شده برای میزبانی جاوا اسکریپت از URI های از پیش ساخته استفاده کنند.
URI از پیش ساخته با استفاده از قالب زیر ساخته می شود:
ad-selection-prebuilt:<use-case>/<name>?<required-script-generation-parameters>
پلت فرم Sandbox Privacy Platem با استفاده از اطلاعات این URI در زمان اجرا ، JavaScript را ارائه می دهد.
IllegalArgumentException
:
- هر یک از پارامترهای مورد نیاز در URI وجود ندارد
- پارامترهای ناشناخته در URI وجود دارد
موارد و نام های URI از پیش ساخته پشتیبانی شده
از مورد 1: انتخاب تبلیغات استفاده کنید
URI های پیش ساخته تحت مورد استفاده ad-selection
در جریان selectAds(AdSelectionConfig)
پشتیبانی می شوند.
نام URI از پیش ساخته: highest-bid-wins
این URI از پیش ساخته JavaScript را فراهم می کند که تبلیغ را با بالاترین پیشنهاد پس از مناقصه انتخاب می کند. همچنین یک تابع گزارشگری اساسی برای گزارش render_uri
برنده و bid
ارائه می دهد.
پارامترهای مورد نیاز
reportingUrl
: URL گزارشگری پایه که با render_uri
و bid
تبلیغات برنده پارامتر می شود:
<reportingUrl>?render_uri=<renderUriOfWinnigAd>&bid=<bidOfWinningAd>
استفاده
اگر URL گزارشگری پایه شما https://www.ssp.com/reporting
است ، آنگاه URI از پیش ساخته خواهد بود:
`ad-selection-prebuilt://ad-selection/highest-bid-wins/?reportingUrl=https://www.ssp.com/reporting`
از مورد 2 استفاده کنید: انتخاب تبلیغات از نتایج خارج
URI های از پیش ساخته تحت ad-selection-from-outcomes
خارج از برنامه ، از جریان کار selectAds(AdSelectionFromOutcomesConfig)
پشتیبانی می کنند.
نام URI از قبل ساخته شده: waterfall-mediation-truncation
URI از پیش ساخته waterfall-mediation-truncation
از پیش ساخته URI JavaScript را فراهم می کند که منطق کوتاه مدت واسطه گری آبشار را در جایی که جاوا اسکریپت در صورت bid
یک شخص اول در صورت بالاتر یا مساوی با bid floor
، بازمی گردد و در غیر این صورت null
برگرداند.
پارامترهای مورد نیاز
bidFloor
: کلید مقدار کف پیشنهاد در getSelectionSignals()
که در برابر تبلیغ SDK واسطه ای مقایسه شده است.
استفاده
اگر سیگنال های انتخاب آگهی شما مانند {"bid_floor": 10}
سپس URI از پیش ساخته حاصل می شود:
`ad-selection-prebuilt://ad-selection-from-outcomes/waterfall-mediation-truncation/?bidFloor=bid_floor`
تست کردن
برای کمک به شما در شروع کار با API مخاطبان محافظت شده ، ما برنامه های نمونه را در کوتلین و جاوا ایجاد کرده ایم که می توانید در GitHub پیدا کنید.
پیش نیازها
API مخاطبان محافظت شده در هنگام انتخاب AD و گزارش تصور ، به JavaScript نیاز دارد. دو روش ارائه این جاوا اسکریپت در یک محیط آزمایش وجود دارد:
- سرور را با نقاط پایانی HTTPS مورد نیاز اجرا کنید که JavaScript را برمی گرداند
- با تهیه کد لازم از یک منبع محلی ، واکشی از راه دور را نادیده بگیرید
در هر دو رویکرد برای تنظیم گزارش تصور نیاز به تنظیم نقطه پایانی HTTPS دارد.
نقاط پایانی HTTPS
برای آزمایش انتخاب تبلیغات و گزارش تصور ، باید 7 نقطه پایانی HTTPS را تنظیم کنید که دستگاه تست یا شبیه ساز شما می تواند به آن دسترسی پیدا کند:
- نقطه پایانی خریدار که در خدمت منطق مناقصه جاوا اسکریپت است.
- نقطه پایانی که در خدمت سیگنال های مناقصه است.
- نقطه پایانی فروشنده که در خدمت منطق تصمیم گیری جاوا اسکریپت است.
- نقطه پایانی که در خدمت سیگنال های به ثمر رساندن است.
- برنده شدن در مورد تصور خریدار ، نقطه پایانی.
- گزارش فروشنده فروشنده نقطه پایانی.
- نقطه پایانی برای ارائه به روزرسانی های روزانه برای مخاطبان سفارشی.
برای راحتی ، repo github کد اساسی جاوا اسکریپت را برای اهداف آزمایش ارائه می دهد. این همچنین شامل تعاریف سرویس OpenAPI است که می تواند به یک پلت فرم پشتیبانی شده یا MicroService پشتیبانی شود. برای اطلاعات بیشتر ، به پروژه readme مراجعه کنید.
واکشی از راه دور جاوا اسکریپت را نادیده بگیرید
این ویژگی در نظر گرفته شده است که برای آزمایش پایان به پایان استفاده شود. برای نادیده گرفتن واکشی از راه دور ، برنامه شما باید در حالت اشکال زدایی با گزینه های توسعه دهنده فعال شود.
برای فعال کردن حالت اشکال زدایی برای برنامه خود ، خط زیر را به ویژگی برنامه در AndroidManifest.xml خود اضافه کنید:
<application
android:debuggable="true">
برای نمونه ای از نحوه استفاده از این Overrides ، لطفاً به برنامه API API مخاطبان محافظت شده در GitHub مراجعه کنید.
شما باید JavaScript سفارشی خود را برای رسیدگی به روالهای انتخاب آگهی مانند مناقصه ، تصمیمات به ثمر رساندن و گزارش دهی اضافه کنید. می توانید نمونه های اساسی کد JavaScript را پیدا کنید که تمام درخواست های مورد نیاز را در repo github انجام می دهد. برنامه نمونه API مخاطبان محافظت شده نحوه خواندن کد از آن پرونده را نشان می دهد و آن را برای استفاده به عنوان نادیده گرفتن آماده می کند.
می توان به طور مستقل از فروش و خرید جاوا اسکریپت در سمت فروش و خرید و فروش غافلگیر شد ، اگرچه به یک نقطه پایانی HTTPS نیاز دارید تا به هر جاوا اسکریپت که برای آن ارائه نمی دهید ، خدمت کنید. لطفاً برای اطلاعات در مورد نحوه تنظیم سرور این موارد ، به README مراجعه کنید.
فقط می توان از جاوا اسکریپت برای مخاطبان سفارشی که متعلق به بسته شما هستند ، نادیده بگیرید.
جاوا اسکریپت سمت فروش را نادیده بگیرید
برای تنظیم نادیده گرفتن جاوا اسکریپت طرف فروش ، موارد زیر را همانطور که در کد زیر نشان داده شده است انجام دهید:
- یک شیء
AdSelectionManager
اولیه کنید. - از شیء
AdSelectionManager
بهTestAdSelectionManager
مراجعه کنید. - یک شیء
AdSelectionConfig
بسازید. - با استفاده از شیء
AdSelectionConfig
و یکString
که به عنوان جاوا اسکریپت شما قصد استفاده از آن را به عنوان یک نادیده گرفته است ، یکAddAdSelectionOverrideRequest
بسازید. - با روش
AddAdSelectionOverrideRequest
وExecutor
مربوطه و اجرایی مربوطه و اشیاءOutcomeReceiver
با روش ناهمزمانoverrideAdSelectionConfigRemoteInfo()
تماس بگیرید.
کاتلین
val testAdSelectionManager: TestAdSelectionManager =
context.getSystemService(AdSelectionManager::class.java).getTestAdSelectionManager()
// Initialize AdSelectionConfig =
val adSelectionConfig = new AdSelectionConfig.Builder()
.setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.build()
// Initialize AddAddSelectionOverrideRequest
val request = AddAdSelectionOverrideRequest.Builder()
.setAdSelectionConfig(adSelectionConfig)
.setDecisionLogicJs(decisionLogicJS)
.build()
// Run the call to override the JavaScript for the given AdSelectionConfig
// Note that this only takes effect in apps marked as debuggable
testAdSelectionManager.overrideAdSelectionConfigRemoteInfo(
request,
executor,
outComeReceiver)
جاوا
TestAdSelectionManager testAdSelectionManager =
context.getSystemService(AdSelectionManager.class).getTestAdSelectionManager();
// Initialize AdSelectionConfig =
AdSelectionConfig adSelectionConfig = new AdSelectionConfig.Builder()
.setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.build();
// Initialize AddAddSelectionOverrideRequest
AddAdSelectionOverrideRequest request = AddAdSelectionOverrideRequest.Builder()
.setAdSelectionConfig(adSelectionConfig)
.setDecisionLogicJs(decisionLogicJS)
.build();
// Run the call to override the JavaScript for the given AdSelectionConfig
// Note that this only takes effect in apps marked as debuggable
testAdSelectionManager.overrideAdSelectionConfigRemoteInfo(
request,
executor,
outComeReceiver);
برای کسب اطلاعات بیشتر در مورد آنچه در هر یک از زمینه های موجود در AdSelectionConfig
نشان می دهد ، به بخش انتخاب AD مراجعه کنید. تفاوت اصلی این است که DeCtICLOGICURL را می توان به یک مقدار نگهدارنده محلول تنظیم کرد زیرا نادیده گرفته می شود.
به منظور نادیده گرفتن جاوا اسکریپت مورد استفاده در هنگام انتخاب آگهی ، decisionLogicJs
باید شامل امضاهای مناسب عملکرد طرف فروشنده باشد. برای نمونه ای از نحوه خواندن یک فایل JavaScript به عنوان یک رشته ، لطفاً به برنامه API API مخاطبان محافظت شده در GitHub مراجعه کنید.
روش ناهمزمان overrideAdSelectionConfigRemoteInfo()
از شیء OutcomeReceiver
برای نشان دادن نتیجه تماس API استفاده می کند.
onResult()
نشان می دهد که نادیده گرفتن با موفقیت اعمال شده است. تماس های آینده به selectAds()
از هر تصمیم و منطق گزارش دهی که در آن تصویب کرده اید به عنوان نادیده گرفتن استفاده می کند.
onError()
پاسخ به دو شرط ممکن است:
- اگر با استدلال های نامعتبر تلاش شود ،
AdServiceException
نشانگرIllegalArgumentException
به عنوان علت است. - اگر اقدامات ناشایست با برنامه ای که در حالت اشکال زدایی با گزینه های توسعه دهنده فعال نشده است ، تلاش می شود ،
AdServiceException
نشانگرIllegalStateException
است.
بازنشانی طرف فروش
این بخش فرض می کند که شما جاوا اسکریپت طرف فروش را نادیده گرفته اید و به شما اشاره می کنید به TestAdSelectionManager
و AdSelectionConfig
که در بخش قبلی استفاده شده است.
به منظور بازنشانی بیش از حد برای همه AdSelectionConfigs
:
- با روش
resetAllAdSelectionConfigRemoteOverrides()
با استفاده از شیءOutcomeReceiver
مربوطه ، با استفاده از روش resteLadeSelectionConfigRemoteOverrides () تماس بگیرید.
کاتلین
// Resets overrides for all AdSelectionConfigs
testAadSelectionManager.resetAllAdSelectionConfigRemoteOverrides(
outComeReceiver)
جاوا
// Resets overrides for all AdSelectionConfigs
testAdSelectionManager.resetAllAdSelectionConfigRemoteOverrides(
outComeReceiver);
پس از تنظیم مجدد طرف فروش ، تماس با selectAds()
از هر چیزی که تصمیم گیری در AdSelectionConfig
ذخیره می شود برای تلاش برای واکشی جاوا اسکریپت مورد نیاز استفاده کنید.
در صورت عدم موفقیت در تماس با resetAllAdSelectionConfigRemoteOverrides()
، بازپرداخت OutComeReceiver.onError()
یک AdServiceException
را فراهم می کند. اگر حذف Overrides با برنامه ای که در حالت اشکال زدایی با گزینه های توسعه دهنده فعال نشده است ، تلاش می شود ، AdServiceException
نشانگر IllegalStateException
است.
جاوا اسکریپت سمت خرید را نادیده بگیرید
- مراحل پیوستن به مخاطب سفارشی را دنبال کنید
- با خریدار و نام مخاطبان سفارشی که می خواهید نادیده بگیرید ، علاوه بر منطق مناقصه و داده هایی که می خواهید از آنها به عنوان نادیده گرفتن استفاده کنید ، یک
AddCustomAudienceOverrideRequest
بسازید. - با روش
AddCustomAudienceOverrideRequest
وExecutor
مربوطه و اجرایی مربوطه و اشیاءOutcomeReceiver
با روش ناهمزمانoverrideCustomAudienceRemoteInfo()
تماس بگیرید
کاتلین
val testCustomAudienceManager: TestCustomAudienceManager =
context.getSystemService(CustomAudienceManager::class.java).getTestCustomAudienceManager()
// Join custom audience
// Build the AddCustomAudienceOverrideRequest
val request = AddCustomAudienceOverrideRequest.Builder()
.setBuyer(buyer)
.setName(name)
.setBiddingLogicJs(biddingLogicJS)
.setTrustedBiddingSignals(trustedBiddingSignals)
.build()
// Run the call to override JavaScript for the given custom audience
testCustomAudienceManager.overrideCustomAudienceRemoteInfo(
request,
executor,
outComeReceiver)
جاوا
TestCustomAudienceManager testCustomAudienceManager =
context.getSystemService(CustomAudienceManager.class).getTestCustomAudienceManager();
// Join custom audience
// Build the AddCustomAudienceOverrideRequest
AddCustomAudienceOverrideRequest request =
AddCustomAudienceOverrideRequest.Builder()
.setBuyer(buyer)
.setName(name)
.setBiddingLogicJs(biddingLogicJS)
.setTrustedBiddingSignals(trustedBiddingSignals)
.build();
// Run the call to override JavaScript for the given custom audience
testCustomAudienceManager.overrideCustomAudienceRemoteInfo(
request,
executor,
outComeReceiver);
مقادیر خریدار و نام همان مواردی است که برای ایجاد مخاطب سفارشی استفاده می شود. در مورد این زمینه ها بیشتر بدانید .
علاوه بر این ، می توانید دو پارامتر اضافی را مشخص کنید:
-
biddingLogicJs
: JavaScript که منطق خریدار را که در هنگام انتخاب تبلیغ استفاده می شود ، نگه می دارد. امضاهای عملکرد مورد نیاز را در این جاوا اسکریپت مشاهده کنید. -
trustedBiddingSignals
: سیگنال های مناقصه ای که در هنگام انتخاب تبلیغ استفاده می شوند. برای اهداف آزمایش این می تواند یک رشته خالی باشد.
روش ناهمزمان overrideCustomAudienceRemoteInfo()
از شیء OutcomeReceiver
برای نشان دادن نتیجه تماس API استفاده می کند.
onResult()
نشان می دهد که نادیده گرفتن با موفقیت اعمال شده است. تماس های بعدی برای selectAds()
از هرگونه منطق مناقصه و گزارش دهی که در آن به عنوان نادیده گرفته شده است استفاده کنید.
onError()
پاسخ به دو شرط ممکن است.
- اگر با استدلال های نامعتبر تلاش شود ،
AdServiceException
نشانگرIllegalArgumentException
به عنوان علت است. - اگر اقدامات ناشایست با برنامه ای که در حالت اشکال زدایی با گزینه های توسعه دهنده فعال نشده است ، تلاش می شود ،
AdServiceException
نشانگرIllegalStateException
است.
تنظیم مجدد طرف خرید
در این بخش فرض می شود که شما جاوا اسکریپت سمت خرید را نادیده گرفته اید و به TestCustomAudienceManager
که در بخش قبلی استفاده می شود ، اشاره دارید.
برای تنظیم مجدد برای همه مخاطبان سفارشی:
- با روش
Executor
مربوطه و اشیاءOutcomeReceiver
resetAllCustomAudienceOverrides()
با مجری مربوطه تماس بگیرید.
کاتلین
// Resets overrides for all custom audiences
testCustomAudienceManager.resetCustomAudienceRemoteInfoOverride(
executor,
outComeReceiver)
جاوا
// Resets overrides for all custom audiences
testCustomAudienceManager.resetCustomAudienceRemoteInfoOverride(
executor,
outComeReceiver)
پس از تنظیم مجدد طرف خرید ، تماس های بعدی به selectAds()
از هر چیزی که biddingLogicUrl
و trustedBiddingData
در CustomAudience
ذخیره می شود ، برای تلاش برای واکشی جاوا اسکریپت مورد نیاز استفاده می شود.
در صورت عدم موفقیت تماس با resetCustomAudienceRemoteInfoOverride()
، بازپرداخت OutComeReceiver.onError()
یک AdServiceException
را فراهم می کند. اگر حذف Overrides با برنامه ای که در حالت اشکال زدایی با گزینه های توسعه دهنده فعال نشده است ، انجام می شود ، AdServiceException
نشانگر IllegalStateException
است.
سرور گزارشگری را تنظیم کنید
هنگامی که از Overrides Remote Fetching استفاده می کنید ، هنوز هم نیاز به تنظیم سرور دارید که دستگاه یا شبیه ساز شما بتواند برای پاسخ به رویدادهای گزارش دهی به آن برسد. یک نقطه پایانی ساده که 200 باز می گردد برای آزمایش کافی است. Repo GitHub شامل تعاریف سرویس OpenAPI است که می تواند به یک پلت فرم مسخره پشتیبانی شده یا میکروسرویس مستقر شود. برای اطلاعات بیشتر ، به پروژه readme مراجعه کنید.
وقتی به دنبال تعاریف OpenAPI هستید ، به دنبال گزارش دهی-سرور .Json باشید. این پرونده حاوی یک نقطه پایانی ساده است که 200 را باز می گرداند و یک کد پاسخ HTTP را نشان می دهد. این نقطه پایانی در طول selectAds()
و سیگنال های API مخاطبان محافظت شده استفاده می شود که گزارشگری را با موفقیت انجام می دهد.
عملکرد برای آزمایش
- عضویت در ورزش یا ترک و راه اندازی مخاطبان سفارشی بر اساس اقدامات قبلی کاربر.
- شروع به انتخاب تبلیغات در دستگاه از طریق جاوا اسکریپت ها از راه دور استفاده کنید.
- مشاهده کنید که چگونه ارتباط یک برنامه با تنظیمات مخاطبان سفارشی ممکن است بر نتایج انتخاب آگهی تأثیر بگذارد.
- گزارش تصور ورزش پس از انتخاب تبلیغ.
محدودیت ها
در جدول زیر محدودیت هایی برای پردازش API مخاطبان محافظت شده ذکر شده است. محدودیت های ارائه شده می تواند بر اساس بازخورد قابل تغییر باشد. برای قابلیت های در حال پیشرفت ، یادداشت های انتشار را بخوانید.
جزء | توصیف محدود | مقدار محدود |
---|---|---|
مخاطبان سفارشی (CA) | حداکثر تعداد تبلیغات در هر CA | 100 |
حداکثر تعداد CAS در هر برنامه | 1000 | |
حداکثر تعداد برنامه هایی که می توانند یک CA ایجاد کنند | 1000 | |
حداکثر تأخیر در زمان فعال سازی یک CA از زمان ایجاد آن | 60 روز | |
حداکثر زمان انقضا یک CA از زمان فعال سازی آن | 60 روز | |
حداکثر تعداد CAS در دستگاه | 4000 | |
حداکثر اندازه نام CA | 200 بایت | |
حداکثر اندازه روزانه URI | 400 بایت | |
حداکثر اندازه منطق مناقصه URI | 400 بایت | |
حداکثر اندازه داده های پیشنهادی قابل اعتماد | 10 کیلوبایت | |
حداکثر اندازه سیگنال های مناقصه کاربر | 10 کیلوبایت | |
حداکثر نرخ تماس برای leaveCustomAudience برای هر خریدار | 1 در ثانیه | |
حداکثر میزان تماس برای joinCustomAudience برای هر خریدار | 1 در ثانیه | |
پس زمینه کالیفرنیا | زمان اتصال | 5 ثانیه |
HTTP زمان خواندن را بخوانید | 30 ثانیه | |
حداکثر اندازه بارگیری کل | 10 کیلوبایت | |
حداکثر مدت زمان تکرار واکشی | 5 دقیقه | |
حداکثر تعداد CAS در هر کار به روز شده است | 1000 | |
انتخاب آگهی | حداکثر تعداد خریداران | TBD |
حداکثر تعداد CAS برای هر خریدار | TBD | |
حداکثر تعداد تبلیغات در حراج | TBD | |
زمان اتصال اولیه | 5 ثانیه | |
اتصال زمان خواندن | 5 ثانیه | |
حداکثر زمان اجرای AdSelection کلی | 10 ثانیه | |
حداکثر زمان اجرای مناقصه در هر CA در AdSelection | 5 ثانیه | |
حداکثر زمان اجرای امتیاز در AdSelection | 5 ثانیه | |
حداکثر زمان اجرای برای هر خریدار در AdSelection | TBD | |
حداکثر اندازه انتخاب آگهی/فروشنده/سیگنال های خریدار | TBD | |
حداکثر اندازه اسکریپت های فروشنده/خریدار | TBD | |
حداکثر نرخ تماس برای selectAds | 1 QPS | |
گزارش تصور | حداقل زمان قبل از حذف انتخاب تبلیغات از پایداری | 24 ساعت |
حداکثر تعداد انتخاب آگهی ذخیره سازی | TBD | |
حداکثر اندازه گزارش url خروجی | TBD | |
حداکثر زمان برای گزارش برداشت | TBD | |
حداکثر تعداد آزمایشات برای تماس های اعلان | TBD | |
پایان زمان اتصال | 5 ثانیه | |
حداکثر زمان اجرای کلی برای reportImpression | 2 ثانیه | |
حداکثر نرخ تماس برای reportImpressions | 1 QPS | |
گزارش رویداد | حداکثر تعداد چراغهای خریدار در هر حراج | 10 |
حداکثر تعداد چراغ در هر فروشنده در هر حراج | 10 | |
حداکثر اندازه کلید رویداد | 40 بایت | |
حداکثر اندازه داده های رویداد | 64 کیلوبایت | |
تبلیغات | حداکثر اندازه لیست تبلیغات | 10 KB که توسط Ald AdData در یک CA واحد به اشتراک گذاشته شده است |
URL ها | حداکثر طول هر رشته URL که به عنوان ورودی گرفته شده است | TBD |
جاوا اسکریپت | حداکثر زمان اجرا | 1 ثانیه برای مناقصه و امتیاز دهی برای گزارش برداشت |
حداکثر حافظه مورد استفاده | 10 مگابایت |
گزارش اشکالات و مسائل
بازخورد شما بخش مهمی از ماسهبازی حریم خصوصی در Android است! به ما اطلاع دهید و از هرگونه مسائلی که می یابید یا ایده هایی را برای بهبود ماسهبازی حریم خصوصی در اندروید به ما اطلاع دهید.
{% کلمه به کلمه %}برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- از هدف قرار دادن مخاطبان سفارشی با API مخاطبان محافظت شده پشتیبانی کنید
- یادداشت های انتشار
- مخاطب محافظت شده: راهنمای ادغام