بموجب سياسة موافقة المستخدم في الاتحاد الأوروبي من Google، يجب الإفصاح عن معلومات محدَّدة للمستخدمين في المنطقة الاقتصادية الأوروبية والمملكة المتحدة والحصول على موافقتهم على استخدام ملفات تعريف الارتباط أو غير ذلك من البيانات المحفوظة على أجهزتهم المحلية، حيثما يقتضي القانون ذلك، وعلى استخدام البيانات الشخصية (مثل معرّف الإعلان) لعرض الإعلانات. تراعي هذه السياسة متطلبات التوجيه الأوروبي بشأن الخصوصية الإلكترونية واللائحة العامة لحماية البيانات (GDPR).
يوضّح هذا الدليل الخطوات المطلوبة لإتاحة رسالة طلب موافقة المستخدِمين بموجب "اللائحة العامة لحماية البيانات" (GDPR) والإصدار 2 من "إطار الشفافية والموافقة" الصادر عن مكتب IAB كجزء من "حزمة تطوير البرامج لمنصّة UMP". يهدف هذا الدليل إلى أن يكون مصحوبًا بدليل البدء الذي يقدّم نظرة عامة حول كيفية تشغيل تطبيقك باستخدام حزمة تطوير البرامج (SDK) لمنصّة UMP وأساسيات إعداد رسالتك. الإرشادات التالية خاصة برسالة طلب موافقة المستخدمين بموجب "اللائحة العامة لحماية البيانات" (GDPR) والإصدار 2 من "إطار الشفافية والموافقة" الصادر عن مكتب IAB. لمزيد من المعلومات، راجِع المقالة كيفية تأثير متطلبات IAB في رسائل طلب موافقة المستخدمين في الاتحاد الأوروبي.
المتطلبات الأساسية
إبطال الموافقة
تتطلّب "اللائحة العامة لحماية البيانات" إبطال الموافقة للسماح للمستخدمين بإلغاء خيارات الموافقة في أي وقت. اطّلِع على خيارات الخصوصية لتنفيذ طريقة تتيح للمستخدمين سحب خيارات الموافقة.
علامة للقاصرين دون سن الرشد
للإشارة إلى ما إذا كان المستخدم دون سن الرشد، اضبط
setTagForUnderAgeOfConsent
(TFUA). عند ضبط TFUA على true
، لا تطلب حزمة تطوير البرامج لمنصة UMP الحصول على موافقة المستخدم. إذا كان تطبيقك يضمّ جمهورًا مختلطًا، اضبط هذه المَعلمة للمستخدمين الأطفال لضمان عدم طلب الموافقة.
يضبط المثال التالي قيمة TFUA على "صحيح" في طلب الموافقة على "منصّة إدارة المستخدمين":
Java
ConsentRequestParameters params = new ConsentRequestParameters
.Builder()
// Indicate the user is under age of consent.
.setTagForUnderAgeOfConsent(true)
.build();
consentInformation = UserMessagingPlatform.getConsentInformation(this);
consentInformation.requestConsentInfoUpdate(
this,
params,
(OnConsentInfoUpdateSuccessListener) () -> {
// ...
},
(OnConsentInfoUpdateFailureListener) requestConsentError -> {
// ...
});
Kotlin
val params = ConsentRequestParameters
.Builder()
// Indicate the user is under age of consent.
.setTagForUnderAgeOfConsent(true)
.build()
consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
this,
params,
ConsentInformation.OnConsentInfoUpdateSuccessListener {
// ...
},
ConsentInformation.OnConsentInfoUpdateFailureListener {
requestConsentError ->
// ...
})
الوساطة
اتّبِع الخطوات الواردة في مقالة إضافة شركاء إعلانات إلى رسائل طلب الموافقة المنشورة بموجب "اللائحة العامة لحماية البيانات" لإضافة شركاء التوسّط إلى قائمة شركاء الإعلانات. وقد يؤدي عدم الالتزام بذلك إلى عدم تمكّن الشركاء من عرض الإعلانات على تطبيقك.
قد يوفّر شركاء التوسّط أيضًا أدوات إضافية للمساعدة في الالتزام باللائحة العامة لحماية البيانات. يمكنك الاطّلاع على دليل الدمج الخاص بأحد الشركاء للحصول على مزيد من التفاصيل.
كيفية قراءة خيارات الموافقة
بعد جمع الموافقة بموجب اللائحة العامة لحماية البيانات، يمكنك قراءة خيارات الموافقة من وحدة التخزين المحلية باتّباع مواصفات الإصدار 2 من إطار الشفافية والموافقة. يشير المفتاح IABTCF_PurposeConsents
إلى الموافقة على كل أغراض إطار الشفافية والموافقة.
يوضّح مقتطف الرمز البرمجي التالي كيفية التحقّق من الموافقة على الغرض 1:
Java
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
// Example value: "1111111111"
String purposeConsents = sharedPref.getString("IABTCF_PurposeConsents", "");
// Purposes are zero-indexed. Index 0 contains information about Purpose 1.
if (!purposeConsents.isEmpty()) {
String purposeOneString = purposeConsents.charAt(0).toString();
boolean hasConsentForPurposeOne = purposeOneString.equals("1");
}
Kotlin
val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
// Example value: "1111111111"
val purposeConsents = sharedPref.getString("IABTCF_PurposeConsents", "")
// Purposes are zero-indexed. Index 0 contains information about Purpose 1.
if (purposeConsents?.isEmpty() == false) {
val purposeOneString = purposeConsents.first().toString()
val hasConsentForPurposeOne = purposeOneString == "1"
}
الأسئلة الشائعة
- ماذا يحدث إذا لم أتّخذ أي إجراء لاستيفاء متطلبات منصّة إدارة الموافقة لعرض الإعلانات في المنطقة الاقتصادية الأوروبية والمملكة المتحدة؟
اعتبارًا من 16 يناير 2024، إذا لم يستخدِم الشريك منصّة إدارة موافقة معتمَدة من Google، ستكون الإعلانات المحدودة فقط مؤهّلة للعرض على الزيارات الواردة من المنطقة الاقتصادية الأوروبية والمملكة المتحدة.
سيبدأ فرض هذه المتطلبات في 16 كانون الثاني (يناير) 2024 على نسبة صغيرة من الزيارات الواردة من المنطقة الاقتصادية الأوروبية والمملكة المتحدة، على أن يتم تطبيقها على جميع هذه الزيارات في نهاية شباط (فبراير) 2024. يُرجى استخدام منصة معتمَدة لإدارة الموافقة بحلول 16 كانون الثاني (يناير) 2024 لضمان عدم تأثُّر عملية تحقيق الربح.
- كيف يمكنني التحقّق مما إذا كان المستخدم قد وافق؟
لا يتم تمثيل الموافقة ببِت واحد، بل بمجموعة من الأغراض والمورّدين على النحو المحدّد في مواصفات إطار الشفافية والموافقة الصادر عن مكتب IAB. راجِع سياسات الموافقة: الإعلانات المخصّصة وغير المخصّصة لمعرفة معايير تخصيص الإعلانات في "إعلانات Google".
بالإضافة إلى ذلك، تستخدم تقنيات الإعلان المدرَجة في قائمة مزوّدي تقنية الإعلان الصادرة عن Google، والتي لم يتم تسجيلها في قائمة مورّدي "إطار الشفافية والموافقة"، المواصفات الفنية لميزة "الموافقة الإضافية" من Google لجمع الموافقات. تنشر Google قائمة مزوّدي تقنية الإعلان غير المسجَّلين لدى مكتب الإعلانات التفاعلية (IAB) وأرقام تعريفهم في الموقع التالي: https://storage.googleapis.com/tcfac/additional-consent-providers.csv.
لتصحيح خطأ في طلب إعلان فردي، استخدِم ميزة تصحيح أخطاء إعدادات الخصوصية في "أداة فحص الإعلانات" للاطّلاع على إشارات الخصوصية التالية التي تم تمريرها في طلب الإعلان كجزء من تكامل الناشر مع "إطار الشفافية والموافقة" الصادر عن مكتب IAB في أوروبا:
تصنيف "فاحص الإعلان" مَعلمة طلب الإعلان المعنى تنطبق اللائحة العامة لحماية البيانات (IABTCF_gdprApplies) gdpr
تُستخدَم لتحديد ما إذا كانت اللائحة العامة لحماية البيانات تنطبق على طلب الإعلان هذا. سلسلة الموافقة والشفافية (IABTCF_TCString) gdpr_consent
سلسلة الموافقة والشفافية توفّر IAB أداة على الويب يمكنك من خلالها فك تشفير القيمة يدويًا. سلسلة الموافقة الإضافية (IABTCF_AddtlConsent) addtl_consent
سلسلة "الموافقة الإضافية" من المواصفات الفنية لـ "الموافقة الإضافية" من Google للاطّلاع على خيارات الموافقة آليًا، يُرجى الرجوع إلى مقالة كيفية الاطّلاع على خيارات الموافقة للحصول على مزيد من المعلومات.
- هل يجب استخدام حزمة تطوير البرامج (SDK) لمنصّة UMP من Google لاستيفاء متطلبات منصّة إدارة الموافقة؟
لا، يمكنك استخدام أيّ منصّة لإدارة الموافقة من قائمة منصّات إدارة الموافقة المعتمَدة من Google لعرض الإعلانات.
- كيف يمكنني عرض نموذج الموافقة مرة أخرى باستخدام "حزمة تطوير البرامج لمنصة UMP" حتى إذا وافق المستخدم من قبل؟
إذا اتّخذ المستخدم قرارًا بالموافقة، لن يطلب حلّ إدارة الموافقة من Google جمع موافقة جديدة إلى أن تنتهي صلاحية سلسلة الموافقة والشفافية أو تصبح غير صالحة.
تتطلّب اللائحة العامة لحماية البيانات تعديل الموافقة للسماح للمستخدمين بسحب خيارات الموافقة في أي وقت. راجِع خيارات الخصوصية لتوفير طريقة تتيح للمستخدمين إلغاء خيارات الموافقة. لعرض نموذج الموافقة مرة أخرى، اتّصِل بالدالة
showPrivacyOptionsForm()
.- لقد دمجتُ منصّة CMP معتمَدة من Google، ولكن لا تظهر لي أي طلبات إعلانات يتم إرسالها إلى شركاء التوسّط حتى من المستخدمين الذين وافقوا على ذلك. سبب هذا التغيير
بموجب "إطار الشفافية والموافقة"، تتحقّق Google من أنّ مزوّدي تقنيات الإعلان ومصادر الطلب الآلية الأخرى لا تنتهك سياسة Google وأنّها تملك أساسًا قانونيًا واحدًا على الأقل لمعالجة البيانات قبل تضمينها في تدفق التوسّط. انتقِل إلى قسم التوسّط للحصول على مزيد من المعلومات.
بعض شركاء التوسّط في قائمة مزوّدي تقنية الإعلان (ATP) من Google غير مسجّلين في قائمة مورّدي "إطار الشفافية والموافقة". بدلاً من ذلك، يستخدم هؤلاء الشركاء المواصفات الفنية لـ "الموافقة الإضافية" من Google لجمع الموافقة. تنشر Google قائمة مزوّدي تقنية الإعلان غير المسجَّلين لدى مكتب الإعلانات التفاعلية (IAB) وأرقام تعريفهم في الموقع التالي: https://storage.googleapis.com/tcfac/additional-consent-providers.csv
تتيح حزمة تطوير البرامج لمنصة UMP تخزين سلسلة الموافقة والشفافية، ما يتيح لك إضافة شركاء إعلانات إلى الرسائل المنشورة لطلب موافقة المستخدمين بموجب "اللائحة العامة لحماية البيانات" بدون الحاجة إلى معرفة ما إذا كان الشركاء مسجّلين في إطار الشفافية والموافقة. عند استخدام منصّة إدارة موافقة تابعة لجهة خارجية، عليك اتّباع الخطوات التالية:
- تأكَّد من أنّ منصّة إدارة الموافقة التابعة لجهة خارجية تتيح تخزين ACString.
- أدرِج كل شريك توسّط في قائمة مزوّدي تكنولوجيا الإعلان الذين تستخدمهم منصّة إدارة الموافقة التابعة لجهة خارجية لجمع الموافقات.
- هل يمكنني تغيير طريقة عمل تطبيقي إذا لم يوافق المستخدمون؟ هل تسمح السياسة بذلك؟
يمكن للناشرين قراءة سلسلة "إطار الشفافية والموافقة" الصادر عن مكتب IAB في تطبيقاتهم. يمكنك الاطّلاع على كيفية قراءة خيارات الموافقة للحصول على معلومات حول قراءة خيارات الموافقة آليًا. على الناشرين مراجعة التزاماتهم بموجب اللوائح التنظيمية ذات الصلة مع مستشار قانوني.
- عندما أنقر على إدارة الخيارات وأوافق على جميع الأغراض، لا تظهر لي أي إعلانات. سبب هذا التغيير
بالإضافة إلى جمع موافقة على الأغراض، عليك أيضًا جمع موافقة البائع. يجب الحصول على موافقة على كلّ من الأغراض والبائعين لكي يتمكّن أي بائع، مثل Google، من عرض الإعلانات المناسبة.
- كيف يمكنني تنفيذ الإصدار 2 من "سلسلة الموافقة الإضافية" للمستخدمين الذين وافقوا على الإصدار 1؟
راجِع المفتاح
IABTCF_AddtlConsent
في وحدة التخزين المحلية وفقًا للمواصفات الفنية الخاصة بميزة "الموافقة الإضافية" من Google لتحديد ما إذا كان المستخدم قد وافق على الإصدار 2 من سلسلة "الموافقة الإضافية" وما إذا كان عليك عرض نموذج الموافقة مرة أخرى.Java
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); // Example value: "2~1.35.41.101~dv.9.21.81" String additionalConsent = sharedPref.getString("IABTCF_AddtlConsent", ""); // Index 0 contains information about the specification version number. if (!additionalConsent.isEmpty()) { String specACVersion = additionalConsent.charAt(0); boolean isACVersion2 = purposeOneString.equals("2"); }
Kotlin
val sharedPref = PreferenceManager.getDefaultSharedPreferences(context) // Example value: "2~1.35.41.101~dv.9.21.81" val additionalConsent = sharedPref.getString("IABTCF_AddtlConsent", "") // Index 0 contains information about the specification version number. if (!additionalConsent.isEmpty()) { val specACVersion = additionalConsent.first() val isACVersion2 = specACVersion == "2" }